список <T>собственность с частным набором - PullRequest
0 голосов
/ 05 марта 2012

Я хотел бы знать, эквивалентно ли это:

private List<FixedTickProvider> minorTickProviders;
public List<FixedTickProvider> MinorTickProviders { get { return minorTickProviders; } }

этому:

public List<FixedTickProvider> MinorTickProviders { get; private set; }

Дело в том, что я унаследовал первый фрагмент кода, в то время какЯ сам более привык ко второму варианту.Поскольку Is собирался переписать часть кода, мне было интересно, если эти два точно эквивалентны.

обратите внимание, что я НЕ говорю о списках только для чтения.Я полностью осведомлен о теме «список только для чтения», как обсуждалось здесь , и мой вопрос немного отличается.

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

Ответы [ 3 ]

3 голосов
/ 05 марта 2012

В C # 3.0 и более поздних версиях автоматически реализуемые свойства делают объявление свойства более кратким, когда в средствах доступа к свойствам не требуется дополнительная логика.Они также позволяют клиентскому коду создавать объекты.Когда вы объявляете свойство, компилятор создает частное анонимное вспомогательное поле, к которому можно получить доступ только через методы доступа get и set свойства.Таким образом, оба будут иметь одинаковый выход ......

2 голосов
/ 05 марта 2012

Да, оба фрагмента кода будут иметь одинаковый результат

//here you are declaring a private field of class
private List<FixedTickProvider> minorTickProviders;
//and only exposing get to rest of the code
public List<FixedTickProvider> MinorTickProviders { get { return minorTickProviders; } }

//here you are declaring a public property which can only be set by the class which is declaring it
public List<FixedTickProvider> MinorTickProviders { get; private set; }

Что касается IL, то будет небольшая разница

В случае отдельного поля и свойства, следующего за IL, будетгенерируется enter image description here

В случае отдельного свойства без поля поддержки

enter image description here

0 голосов
/ 05 марта 2012

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


(Конечно, в случае присваивания свойства вполне вероятно, что вызов метода и возможное присвоение поля достаточно просты для встраивания)

...