Использование бэк переменную для получения и установки

Возможно, это глупый вопрос, однако я новичок в С# (больше из фона Java) и запутался между разными примерами, которые я видел относительно getters и seters свойства.

В некоторых ситуациях код выглядит следующим образом:

    private string _something;
    public string Something
    {
        get { return _something; }
        set { _something = value; }
    }

Однако в других примерах они не используют этот вспомогательный memeber, и поэтому это примерно так:

    public string Something { get; set; }

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

Я пишу свою программу, используя последний подход, но хочу проверить, что я ничего не пропустил.

Может кто-нибудь объяснить, почему люди решили сделать первое? Это более "хорошая практика"?

Спасибо большое!

Ответ 1

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

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

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

Ответ 2

Предыдущий синтаксис был необходим до .NET 3.5 и поэтому найден в более старом коде.

Это функционально эквивалентно.

Ответ 3

public string Что-то {get; задавать; } это просто короткая рука. в фоновом режиме он делает то же самое, что и выше.

Ответ 4

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

Что-то вроде:

    private string _something;
    public string Something
    {
        get { return _something; }
        set { 
              _something = value; 
              OnNotifyPropertyChanged("Something");
            }
    }

Это будет предупреждать ваш фронт, что его связанное свойство было изменено, и оно должно обновляться.

Ответ 6

Ссылка на автоматические свойства из вашего экземпляра совпадает с объявлением открытого поля, что нарушает Принцип инкапсуляции. Поэтому используйте автоматические свойства, если вы не обращаетесь к ним в пределах одного класса. В противном случае используйте поле member (backing) и ссылку, что из ваших локальных методов, пока выставляете их через обычное свойство .NET.

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