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

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

enter image description here

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

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

Ответ 1

Да, компилятор генерирует пару методов 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;
}

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

См. Jon Skeet Почему Свойства Материи.

Ответ 2

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

myFoo.stringProp = "bar";

Компилятор действительно генерирует IL-код следующим образом:

ldstr       "bar"
callvirt    foo.set_stringProp

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

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

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

Ответ 3

Это проблема интеллектуализации визуальной студии, которая выбирается по имени. Кстати, ваш код не будет компилироваться даже из-за конфликта имен в том же типе.

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

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 (свойство)

Ответ 4

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

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

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

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

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

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