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

Разница между автоматическими свойствами и открытым полем в С# 3.0

Мне не удалось понять, почему в С# 3.0 есть функция автоматического использования свойств языка.

Какая разница, когда вы говорите

public string FirstName;

чем

public string FirstName { get; set; }
4b9b3361

Ответ 1

Потому что они реализованы по-разному в результате кода IL (и машинного языка). Свойство Automatic все еще отображается как публичный getter и setter, тогда как публичное поле - это просто одно поле.

Таким образом, реализация свойства auto позволяет в какой-то позднее момент изменить внутреннее поведение либо getter, либо setter (например, добавление валидатора) без повторной компиляции или re = кодирования любых зависимых классов, которые его используют...

Ответ 2

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

public string FirstName { get; private set; }

Пользователь вашего класса видит FirstName как общедоступное. Однако он/она не может писать на него.

Ответ 3

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

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

Кроме того, свойства имеют разные преимущества по сравнению с полями. Мое основное личное возражение против полей заключается в том, что оно предоставляет решение для реализации в API.

Ответ 4

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

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

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

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

Ответ 5

из-за этого использования:
public string FirstName { get; private set; }
простое свойство, что 'kosher' по правилам OO

Ответ 6

Первое - это публичное поле, а второе - публичное.

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

Ответ 7

Авто свойства - это компиляторы, генерирующие регулярные свойства, они используют поля поддержки, такие как любое регулярное свойство, но для этого вам не нужно писать код. Вот очень показательный пример (благодаря Reflector) кода, сгенерированного компилятором:

[CompilerGenerated]
private string <ContentType>k__BackingField;

public string ContentType
{
    [CompilerGenerated]
    get
    {
        return this.<ContentType>k__BackingField;
    }
    [CompilerGenerated]
    set
    {
        this.<ContentType>k__BackingField = value;
    }
}