Как правило, свойства нуждаются в вспомогательном поле, если они не являются простыми "автоматическими свойствами" получения / установки.
Итак, если вы просто делаете ...
public string Name { get; set; } // automatic property
... вам не нужно поле, и я согласен, нет причин его иметь.
Однако, если вы делаете ...
public string Name
{
get { return _name; }
set
{
if (value = _name) return;
_name = value;
OnPropertyChange("Name");
}
}
... вам нужно это _name
вспомогательное поле.
Для закрытых переменных, которые не требуют специальной логики get / set, на самом деле это суждение о том, нужно ли создавать частное автоматическое свойство или просто поле. Я обычно делаю поле, затем, если мне нужно, чтобы оно было protected
или public
, я изменю его на автоматическое свойство.
Обновление
Как отметил Ясир, если вы используете автоматические свойства, за кулисами все еще скрывается поле, просто вам не нужно ничего печатать. Итак, суть в том, что свойства не хранят данные, они предоставляют доступ к данным. Поля - это то, что на самом деле содержит данные. Так что они вам нужны, даже если вы их не видите.
Обновление 2
Относительно вашего исправленного вопроса ...
есть ли время, когда SomeType someField; предпочтительнее SomeType SomeProperty { get; set; }
?
... одна вещь, которая приходит на ум: если у вас есть личное поле, и (в соответствии с соглашением для частных полей) вы называете его _name
, это сигнализирует вам и всем, кто читает ваш код, что вы работаете напрямую с личными данными. Если, с другой стороны, вы делаете все свойством и (в соответствии с соглашением о свойствах) вызываете свое частное свойство Name
, теперь вы не можете просто посмотреть на переменную и сказать, что это частные данные. Таким образом, использование только свойств удаляет некоторую информацию. Я не пробовал работать со всеми свойствами, чтобы определить, является ли это важной информацией, но что-то определенно потеряно.
Еще одна вещь, более незначительная, заключается в том, что public string Name { get; set; }
требует большего набора текста (и немного более грязно), чем private string _name
.