Почему я должен использовать автоматически реализованное свойство вместо поля?

Между этими двумя:

С свойством:

class WithProperty
{
    public string MyString {get; set;}
}

С полем:

class WithField
{
    public string MyString;
}

По-видимому, я должен выбрать первый. Почему?

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

Я пропустил что-то важное здесь?

Ответы

Ответ 1

Важнейшим отличием является тот факт, что если вы используете поле, а затем нужно изменить его на свойство (скажем, для обеспечения некоторой проверки), тогда все библиотеки, вызывающие ваш код, должны быть перекомпилированы. Верно, что вы можете скомпилировать тот же самый код, если имя остается прежним, но потребители вашего кода все равно должны быть перекомпилированы. Это связано с тем, что ИЛ, генерируемый для получения значения, отличается между полем и свойством. Если он уже является свойством, вы можете внести изменения, не заставляя пользователей вашего кода изменять.

Это может быть или не быть проблемой для вас. Но свойство почти такое же количество кода, и считается лучшей практикой. Я всегда буду искать собственность.

Ответ 2

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

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

Ответ 3

Важная часть, которую вам не хватает, - это тяжесть этого утверждения:

При повторной компиляции

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

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

Ответ 4

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

Например, если вам нужно добавить логику проверки в set.