Какая разница между инкапсулированием частного члена как свойства и определением свойства без частного члена?

Какая разница (производительность, память... и т.д.) между инкапсулированием частного члена вроде этого

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

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

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