2014-02-18 3 views
1

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

Я хочу знать, простой и простой. Почему эта стандартная практика?

Почему вы создаете приватную локальную переменную для свойств?

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

private int _widget; 

public int widget 
{ 
    get{ return _widget; } 
    set{ _widget = value; } 

} 

Не кажется ли это излишним и пустым?

Никто никогда не называет частную переменную напрямую. Вы всегда устанавливаете его через свойство.

Почему бы не просто исправить это?

Есть ли темная магия, о которой я не знаю при использовании этого?

public int widget {get; set;} 
+1

@ p.s.w.g Вы должны ответить на этот вопрос. – Measuring

+0

Чтобы уточнить, что говорит p.s.w.g: Раньше было невозможно создать однострочное свойство. Вы _needed_ лежащая в основе частная переменная. – Brandon

+0

Значит, это еще одно удержание с предыдущих дней? –

ответ

2

Автоматические свойства (или auto-implemented properties) не были доступны до C# 3.0.

Возможно одно преимущество первого варианта (с полем подложки) является то, что вы можете инициализировать его значение до значения не по умолчанию, без необходимости реализовать конструктор, например:

private int _widget = 123; 
public int widget 
{ 
    get{ return _widget; } 
    set{ _widget = value; } 
} 
0

Как @pswg и @Brandon сообщила, что это функция, добавленная в .Net 3.0, называемая свойствами Auto-Implemented, идея состоит в том, что вам больше не нужно объявлять приватную переменную в ваших классах, просто публичное свойство и всю необходимую обработку для поддержки, которую выполняет рамки.

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

Вы можете посмотреть его здесь: http://msdn.microsoft.com/en-us/library/bb384054.aspx

3

Если вы просто смотрите на простом примере, вы правы, это выглядит как отходы.

BUT ... Есть еще к этому.

Вот большая статья, которая идет в гораздо более подробно: Why Properties Matter по переполнением стека легенды Jon тарелочкам.

Прежде всего, это стало правилом лучших практик, чтобы публично не публиковать поля классов. У вас нет контроля над тем, что происходит с ним. Но если вы используете свойство вместо этого, у вас есть возможность добавлять дополнительную логику, которая происходит под капотом, так часто, как требуется, без изменения каких-либо изменений в публичном интерфейсе вашего класса. Это может быть код для обработки множественного доступа к ограниченным ресурсам, таким как сеть/база данных и т. Д. ...

Во-вторых, с версией с полем подложки вы можете очень легко реализовать интерфейс INotifyPropertyChanged для использования значений с WPF и Model-View-ViewModel (MVVM) модель:

public string FavoriteColor 
{ 
    get 
    { 
     return this.favoriteColor; 
    } 

    set 
    { 
     if (value != this.favoriteColor) 
     { 
     this.favoriteColor = value; 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs("FavoriteColor")); 
      } 
     } 
    } 
} 

(код фрагмент взято с Basic MVVM QuickStart)

В-третьих: Но если вам когда-либо понадобится перейти из общего поля в собственность - у вас получится другой код IL - вы теряете бинарную совместимость. Это может повлиять на сериализацию и перекомпилировать код из других сборок, которые обращаются к измененному классу. Это было бы плохо, если бы вы развертывали свое приложение в частичных обновлениях, когда одновременно развертываются не все сборки.

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

Смежные вопросы