Мне не удалось понять, почему в С# 3.0 есть функция автоматического использования свойств языка.
Какая разница, когда вы говорите
public string FirstName;
чем
public string FirstName { get; set; }
Мне не удалось понять, почему в С# 3.0 есть функция автоматического использования свойств языка.
Какая разница, когда вы говорите
public string FirstName;
чем
public string FirstName { get; set; }
Потому что они реализованы по-разному в результате кода IL (и машинного языка). Свойство Automatic все еще отображается как публичный getter и setter, тогда как публичное поле - это просто одно поле.
Таким образом, реализация свойства auto позволяет в какой-то позднее момент изменить внутреннее поведение либо getter, либо setter (например, добавление валидатора) без повторной компиляции или re = кодирования любых зависимых классов, которые его используют...
Чтобы добавить к тому, что говорили другие люди, объявив публичное поле, поле доступно для чтения и записи. объявляя публичное автоматическое свойство, хотя свойство является общедоступным, вы все равно можете добавить модификатор для контроля доступности на уровне get/set.
public string FirstName { get; private set; }
Пользователь вашего класса видит FirstName как общедоступное. Однако он/она не может писать на него.
Подумайте, что произойдет, если позже вы захотите изменить каждое из них на свойство с пользовательской реализацией. Если это автоматически реализуемое свойство, вы просто добавляете поле и меняете реализацию. Полная совместимость с исходными и двоичными файлами.
Если это поле начинается, вы не получаете ни исходной, ни двоичной совместимости. Вы должны перестроить все, что ссылается на него, и исправить все, что больше не компилируется.
Кроме того, свойства имеют разные преимущества по сравнению с полями. Мое основное личное возражение против полей заключается в том, что оно предоставляет решение для реализации в API.
Отличие заключается в том, что другие сборки, скомпилированные с кодом, который считывает свойство, скомпилированы против свойства.
Если вы позже решите, что вам нужно добавить код в getter или setter, вы можете сделать это, не заставляя каждую связанную с ним сборку перекомпилировать.
Не так с полями. Если впоследствии вы измените поле, чтобы быть свойством, чтобы добавить этот код, другие сборки, связанные с вашими, перестанут функционировать должным образом, поскольку они скомпилированы для чтения поля, а не свойства.
Кроме того, много кода написано для поиска свойств, а не полей, таких как привязка данных и т.д.
из-за этого использования: public string FirstName { get; private set; }
простое свойство, что 'kosher' по правилам OO
Первое - это публичное поле, а второе - публичное.
Основное различие заключается в том, как они используются. Например, WPF может привязывать только данные к свойствам, а не к полям.
Авто свойства - это компиляторы, генерирующие регулярные свойства, они используют поля поддержки, такие как любое регулярное свойство, но для этого вам не нужно писать код. Вот очень показательный пример (благодаря Reflector) кода, сгенерированного компилятором:
[CompilerGenerated]
private string <ContentType>k__BackingField;
public string ContentType
{
[CompilerGenerated]
get
{
return this.<ContentType>k__BackingField;
}
[CompilerGenerated]
set
{
this.<ContentType>k__BackingField = value;
}
}