Когда следует использовать поле, а не свойство?

Может ли кто-нибудь четко сформулировать, когда вы используете поле, а когда использовать свойство в дизайне класса?

Учитывать:

public string Name;

Or:

private string _Name;
public string Name
{
   get { return _Name; }
   set { _Name = value; }
}

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

Но тогда почему я вижу, что люди используют первый метод? Они просто ленивы или есть какая-то конкретная ситуация, когда это правильный выбор? Это просто вопрос предпочтений?


person Deane    schedule 13.03.2009    source источник
comment
Кстати, использование подчеркиваний для ваших закрытых членов - это не способ делать что-то в .NET. Ознакомьтесь с msdn.microsoft.com/en-us/library/ms229045.aspx   -  person Alan    schedule 13.03.2009
comment
Вы путаете поля с атрибутами. публичная строка Имя; это общедоступное поле, а не атрибут.   -  person Jonathan Parker    schedule 13.03.2009
comment
codinghorror.com/blog/archives/000654.html Посмотрите на это не- смысл.   -  person Alan    schedule 13.03.2009
comment
+1 к комментарию Джонатана Паркера. Дин, не возражаете, если мы отредактируем вопрос, чтобы использовать правильную терминологию?   -  person Jon Skeet    schedule 13.03.2009
comment
Я его отредактировал, так как в результате уже отправил неверный ответ ;-p   -  person Marc Gravell    schedule 13.03.2009
comment
На самом деле, я считаю весьма полезным добавлять к полям префикс _ (хотя используйте camelCasing), поскольку он четко отделяет поля от локальных переменных и параметров.   -  person Peter Lillevold    schedule 13.03.2009
comment
@Alan, Рекомендации по дизайну - это всего лишь рекомендации. По крайней мере, для служебных и личных дел нужно выбирать то, что подходит команде. Что касается публичных вещей, я согласен, мы все должны следовать стандарту.   -  person Peter Lillevold    schedule 13.03.2009
comment
Итак, позвольте мне подтвердить - ЕДИНСТВЕННОЕ различие между полем и свойством - это наличие геттеров и / или сеттеров, верно? Синтаксически это похоже на единственную разницу.   -  person Deane    schedule 13.03.2009
comment
@ Питер: Ты прав. Это рекомендации. и нужно придерживаться консенсуса команды. Тем не менее, руководство хорошо написано и предлагает общую основу, с которой можно начать, даже для внутренних соглашений об именах.   -  person Alan    schedule 13.03.2009


Ответы (7)


Что ж, в C # 3.0 вы можете написать:

public string Name {get; set;}

Что позволяет быть порядочным и ленивым.

Вообще говоря, со свойствами вы получаете правильную инкапсуляцию. У вас есть выбор: разрешить установку значения, или получение, или и то, и другое. Используя общедоступного члена, у вас нет такой возможности.

Вероятно, это предпочтение от одной части, а с другой - от того, как ваша команда решает обрабатывать быстрые и грязные определения классов, но я бы сказал, используйте свойства для получения / набора.

Отвечать

Может ли кто-нибудь четко сформулировать, когда вы используете атрибут, а когда использовать свойство в дизайне класса?

Вы никогда не должны использовать публичный атрибут. Вместо этого вы всегда должны использовать свойство. Это безопаснее и гибче. Тем не менее, люди будут ленивы и просто будут использовать публичный член. Однако с C # 3.0 вы можете использовать более сжатый синтаксис для определения свойств, который должен удовлетворить вашу внутреннюю лень.

Просто введите prop и нажмите <tab>, чтобы ускорить добавление свойства.

person Alan    schedule 13.03.2009
comment
Просто примечание: вы никогда не должны говорить не следует, когда говорите код. - person Alan; 23.05.2009
comment
Вы никогда не должны использовать публичный атрибут больше похоже на личное мнение, чем на технический ответ - person ; 10.08.2016

Просто дополнительная информация к ответу Алана:

public string Name {get; set;}

такой же как

private string _Name;

public string Name{   
get { return _Name; }   
set { _Name = value; }
}

Если вы хотите запретить заданную функцию имени, вы можете иметь

общедоступная строка Имя {получить; частный набор;}

person Billy    schedule 13.03.2009

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

Они также упрощают рефакторинг.

Дополнительная информация:

person Christian C. Salvadó    schedule 13.03.2009

Используя свойства, вы можете контролировать его безопасность:

public string Foo { protected get; private set; }

Свойства позволяют легко вызывать события:

public string Foo
{
  get { return _foo; }
}
set
{
  bool cancel = false;
  if(BeforeEvent != null) // EventHandler<CancelEventArgs> BeforeEvent
  {
    CancelEventArgs e = new CancelEventArgs();
    BeforeEvent(this, e);
    cancel = e.Cancel;
  }
  if(!cancel)
  {
    _foo = value;
    if(AfterEvent != null) // EventHandler<EventArgs> AfterEvent
    {
      AfterEvent(this, new EventArgs());
    }
  }
}

Также я часто использую такой код:

string Foo
{
  set
  {
    IsFooSet = value != null;
  }
}

bool IsFooSet
{
  get { return _isFoo; }
  set
  { 
   _isFoo = value;
   if(value) // some event raise or controls on form change
  }
}
person abatishchev    schedule 13.03.2009

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

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

person tranmq    schedule 13.03.2009

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

person AakashM    schedule 13.03.2009

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

public string Name { get; private set; }

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

person sotrh    schedule 29.05.2014