Подтвердить что ты не робот

Имущество (без дополнительной обработки) против публичного поля

Всякий раз, когда возникает вопрос о достоверности свойств, я вижу, что большинство обсуждений происходит вокруг функций/методов и свойств. Но я также хотел бы знать причину убедительной для использования свойства с соответствующим приватным полем против открытого поля непосредственно непосредственно, включая наиболее распространенные методы get/set без какой-либо другой обработки, я имею в виду этот путь

public string CustomerName;

против

private string customerName;
public string CustomerName
{
get{return customerName;}
set(string value){this.customerName=value;}
}
4b9b3361

Ответ 1

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

Обратите внимание, что вам не нужен весь последний блок в С# 3:

public string CustomerName { get; set; }

Для получения дополнительной информации см. мою статью "Почему Свойства Материи" .

Ответ 2

  • Вы можете переопределить или хотя бы создать "новое" свойство в производном классе

  • В этот момент люди ожидают, что свойства будут выставлены, а поля будут скрыты. Если кто-то будет размышлять над вашим классом (его становится все более распространенным с такими инструментами, как Castle Windsor, NHibernate), существует мир различий, скорее всего, они не будут проверять открытые поля.

Ответ 3

Это в основном ошибка в Java. На многих других языках (Python, Delphi, Groovy) компилятор будет генерировать геттеры и сеттеры для вас, если вы не предоставите код.

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

Это одна из тех вещей, где реальность сталкивается с дизайном. Разработчики Java не хотели, чтобы компилятор делал все, что вы не видите. То, что казалось хорошей идеей много лет назад, не получилось слишком хорошо.

Ответ 4

Я замечаю одно полезное использование свойства. Если вы собираетесь привязать коллекцию своего объекта к DataGrid или DataGridView или другому связанному элементу управления, единственными признанными оцененными именами являются Property, а не общедоступные поля.

Ответ 5

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

private int height;
public int Height
{
  get{ return height; }
  set 
  { 
     if (value > 0)
     {
         height = value;
     }
  }
}

Ответ 6

Даже без дополнительной обработки есть еще несколько преимуществ:

  1. Хорошая практика кодирования. В общем, хорошо не выставлять свои поля непосредственно внешним классам, а вместо этого разрешать им доступ только через этот дополнительный уровень абстракции. Даже без дополнительной обработки все равно хорошо быть последовательным, поскольку это может понадобиться где-то еще в коде.
  2. Возможно, вам потребуется изменить поле на свойство позже, когда у вас будет несколько других проектов, зависящих от вашего. Это потребует перекомпиляции всего.
  3. С ними можно использовать события, такие как привязка обработчиков к событиям PropertyChanging или PropertyChanged. В случае полей это невозможно.