Являются ли свойства C# на самом деле методами?


до сих пор у меня было впечатление, что Properties & Methods это две разные вещи в C#. Но потом я сделал что-то вроде ниже.

и это было "открытие глаз" для меня. Я ожидал одно свойство stringProp и один способ stringProp но вместо этого я получил это.

Почему это произошло? может кто-нибудь объяснить, пожалуйста.

4 74

4 ответа:

да, компилятор создает пару методов get и set для свойства, а также частное резервное поле для автоматически реализованного свойства.

public int Age {get; set;}

становится эквивалентом:

private int <Age>k__BackingField;

public int get_Age()
{
     return <Age>k__BackingField;
}

public void set_Age(int age)
{
    <Age>k__BackingField = age;
}

код, который обращается к вашему свойству, будет скомпилирован для вызова одного из этих двух методов. Это именно одна из причин, по которой изменение публичного поля на публичную собственность является критическим изменением.

смотрите Джона Скита Почему Свойства Материя.

строго говоря, свойства не являются методами, хотя они are действительно поддерживается getter и setter методы (также называемые методы доступа). Когда вы пишете такой код (при условии, что вы измените код, чтобы удалить ошибку компиляции, упомянутую ниже)

myFoo.stringProp = "bar";

компилятор фактически генерирует IL-код следующим образом:

ldstr       "bar"
callvirt    foo.set_stringProp

здесь set_stringProp - это метод setter для этого свойства. На самом деле, если вы так хотите, вы можете вызвать эти методы непосредственно через отображение.

тем не менее, образец кода, который вы опубликовали, может выглядеть хорошо в intellisense Visual Studio, но он не будет компилироваться. Попробуйте построить проект, и вы увидите ошибку, как:

тип ' foo 'уже содержит определение для 'stringProp'

это проблема Visual studio intelicence, которая выбирает на имя. Кстати Ваш код не будет компилироваться даже, из-за столкновения имен в том же типе.

но вы правы, что свойства are методы в конце:

public class A {

   public string Name  {get;set;}  
}

здесь Name свойство преобразуется в 2 метода:get_Name() и set_Name().

на самом деле, если вы определяете класс следующим образом:

public class A {

   public string Name  {get;set;}  

   public string get_Name() {
       return "aaa"; 
   }
}

вы получите ошибку компиляции, так как нет уже определено get_Name (собственность)

да. Свойстваmutator методы.

в информатике метод мутатора-это метод, используемый для управления изменениями переменной. Они также широко известны как методы сеттера. Часто сеттер сопровождается геттером (также известным как метод доступа), который возвращает значение частной переменной-члена.

метод мутатора наиболее часто используется в объектно-ориентированном программировании, в соответствии с принципом инкапсуляции. Согласно этому принципу, член переменные класса становятся закрытыми, чтобы скрыть и защитить их от другого кода, и могут быть изменены только открытой функцией-членом (метод мутатора), которая принимает желаемое новое значение в качестве параметра, необязательно проверяет его и изменяет закрытую переменную-член.

методы Мутатора могут также использоваться в не объектно-ориентированных средах. В этом случае ссылка на изменяемую переменную передается в мутатор вместе с новым значением. В этом случае компилятор невозможно запретить коду обходить метод мутатора и изменять переменную напрямую. Ответственность ложится на разработчиков, чтобы гарантировать, что переменная изменяется только через метод мутатора и не изменяется непосредственно.

в языках программирования, которые их поддерживают, свойства предлагают удобную альтернативу, не отказываясь от утилиты инкапсуляции.

ссылка:http://en.wikipedia.org/wiki/Mutator_method