Просто подумал, что поделюсь своими выводами на эту тему.
Кодирование свойства, подобного следующему, - это быстрый вызов .net 3.0 « автоматически реализованное свойство ».
public int MyProperty { get; set; }
Это спасет вас от набора текста. Долгий путь объявления свойства таков:
private int myProperty;
public int MyProperty
{
get { return myProperty; }
set { myProperty = value; }
}
Когда вы используете «автоматически реализуемое свойство», компилятор генерирует код для соединения get и устанавливает значение «k_BackingField». Ниже приведен дизассемблированный код с использованием Reflector.
public int MyProperty
{
[CompilerGenerated]
get
{
return this.<MyProperty>k__BackingField;
}
[CompilerGenerated]
set
{
this.<MyProperty>k__BackingField = value;
}
}
дизассемблированный код C # из IL
Также подключает метод для сеттера и геттера.
[CompilerGenerated]
public void set_MyProperty(int value)
{
this.<MyProperty>k__BackingField = value;
}
[CompilerGenerated]
public int get_MyProperty()
{
return this.<MyProperty>k__BackingField;
}
дизассемблированный код C # из IL
Когда вы объявляете автоматически реализуемое свойство только для чтения, устанавливая для установщика значение private:
public int MyProperty { get; private set; }
Все компиляторы помечают " set " как private. Методы установки и получения говорят одинаково.
public int MyProperty
{
[CompilerGenerated]
get
{
return this.<MyProperty>k__BackingField;
}
private [CompilerGenerated]
set
{
this.<MyProperty>k__BackingField = value;
}
}
дизассемблированный код C # из IL
Так что я не уверен, почему фреймворк требует как получить; и установить; на автоматически реализованной собственности. Они могли бы просто не написать метод set и setter, если бы он не был предоставлен. Но может быть какая-то проблема на уровне компилятора, которая затрудняет это, я не знаю.
Если вы посмотрите на длинный способ объявления свойства только для чтения:
public int myProperty = 0;
public int MyProperty
{
get { return myProperty; }
}
А затем посмотрите на разобранный код. Сеттера там нет вообще.
public int Test2
{
get
{
return this._test;
}
}
public int get_Test2()
{
return this._test;
}
дизассемблированный код C # из IL