В чем разница между инкапсулированием частного члена как свойства и определением свойства без частного члена? - PullRequest
12 голосов
/ 24 ноября 2010

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

private int age;
public int Age
{
  get { return age; }
  set { age = value; }
}

и определением свойства, подобного этому

public int Age
{
  get ;
  set ;
}

Ответы [ 5 ]

11 голосов
/ 24 ноября 2010

Во втором случае компилятор C # сгенерирует поле для вас и сгенерирует геттер и сеттер для доступа к нему.Другими словами, между двумя примерами кода, которые вы разместили, нет функциональной разницы.Единственным отличием будет имя приватного поля, которое будет сгенерировано компилятором.

6 голосов
/ 24 ноября 2010

Код, сгенерированный компилятором C # для автоматически реализуемых свойств , почти идентичен вашему первому примеру (в нем используется закрытое поле поддержки), так что я бы не волновалсяоб этом слишком много.

Реальное различие только состоит в том, что он украшает метод получения и установки свойства с атрибутом [CompilerGenerated].Это не должно влиять на производительность получения и установки свойства.(В качестве незначительного придирки это должно немного увеличить размер двоичного файла сборки).

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

1 голос
/ 24 ноября 2010

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

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

1 голос
/ 24 ноября 2010

Разница в том, что у вас есть контроль над геттерами и сеттерами.

С автоматической реализацией вы не можете сделать что-то вроде:

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);
}

Если выэто не нужно, автоматической реализации должно быть достаточно.

Основное преимущество по сравнению с использованием автоматической реализации свойств по сравнению с полем состоит в том, что при использовании автоматической реализации свойств и в дальнейшем вы хотите изменитьРеализация, например, выше, интерфейс вашего класса не меняется.

1 голос
/ 24 ноября 2010

Я задал этот вопрос некоторое время назад:

см. Правильное использование свойств C #

Цитирую ответ:

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

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

С точки зрения кодирования, я предпочитаю вторую версию, которая является более компактной (меньше писать, меньше читать).

Второй синтаксис был введен в C # 3.0. Таким образом, первый вариант будет более совместим со старыми компиляторами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...