Какая разница между инкапсулированием частного члена как свойства и определением свойства без частного члена?
Какая разница (производительность, память... и т.д.) между инкапсулированием частного члена вроде этого
private int age;
public int Age
{
get { return age; }
set { age = value; }
}
и определите свойство, подобное этому
public int Age
{
get ;
set ;
}
Ответы
Ответ 1
Код, созданный компилятором С# для автоматически реализованных свойств, почти идентичен вашему первому примеру (он использует закрытое поле поддержки), поэтому я не стал бы слишком беспокоиться об этом.
Единственное реальное отличие состоит в том, что он украшает свойство getter и setter с атрибутом [CompilerGenerated]
. Это не должно влиять на производительность получения и настройки свойства. (В качестве второстепенного nitpick это должно немного увеличить размер сборки двоичного файла).
То, что мне нравится в автоматически реализованных свойствах, кроме краткости, конечно же, заключается в том, что он не позволяет даже объявляющему типу доступа к полю backing вместо свойства (фоновое поле является анонимным). Это дает ясность коду и, как правило, упрощает реорганизацию/изменение реализации свойств.
Ответ 2
Во втором случае компилятор С# создаст для вас поле и сгенерирует getter и setter для доступа к нему. Другими словами, нет никакой функциональной разницы между двумя приведенными вами образцами кода. Единственным отличием будет имя частного поля, которое будет сгенерировано компилятором.
Ответ 3
Я задал этот вопрос некоторое время назад:
см. Правильное использование свойств С#
Цитирование ответа:
Они эквивалентны во внутренней скомпилированной форме, за исключением того, что вы не можете получить доступ к генерируемой компилятору приватной переменной во второй форме.
С точки зрения эффективности кода они также эквивалентны, компилятор точно в момент, как правило, напрямую обращается к частной переменной без накладных расходов на вызов функции доступа (после того, как среда выполнения проверила доступность и т.д.),
С точки зрения кодирования, я предпочитаю вторую версию, которая более компактна (меньше для записи, меньше для чтения).
Второй синтаксис был введен в С# 3.0. Таким образом, первый вариант будет более совместим со старыми компиляторами.
Ответ 4
Разница в том, что у вас есть контроль над получателями и сеттерами.
С автоматической реализацией вы не можете сделать что-то вроде:
private int age;
public int Age
{
get { return age; }
set
{
if (age != value)
{
age = value;
OnAgeChanged(EventArgs.Empty);
}
}
}
public event EventHandler AgeChanged;
protected virtual void OnAgeChanged(EventArgs e)
{
var handler = AgeChanged;
if (handler != null)
handler(this, e);
}
Если вам это не нужно, автоматическая реализация должна быть достаточной.
Основным преимуществом использования автоматической реализации свойства по сравнению с полем является то, что при использовании автоматической реализации свойств, а затем вы хотите изменить реализацию, например. выше, интерфейс вашего класса не изменяется.
Ответ 5
Никакая разница по сравнению с производительностью во втором случае - синтетический сахар для записи свойств, называемых автоматическими свойствами.
если вы хотите поместить некоторую логику в набор или получить часть, вы не сможете сделать это автоматически.