Здесь происходит нечто странное, что даже опытные разработчики время от времени спотыкаются ... и пропускает разницу между защитным полем и имуществом. Это происходит время от времени ... и абсолютно сбивает с толку разработчика, пока он не осознает, что допустил ошибку Visual Studio в IntelliSense. Вдвойне вероятно, если вы назовете свое вспомогательное поле таким же, как имя свойства ... отличается только регистром.
class Song
{
private string title; //--> this is the "backing field" for the property "Title"
public string artist;
public int duration;
public Song(string aTitle, string aArtist, int aDuration)
{
//title = aTitle; //--> this only sets the backing field...not the "Title" property
Title = aTitle; //--> this sets your "Title" property
artist = aArtist;
duration = aDuration;
}
Следующая проблема заключается в том, что в свойстве set
value
является входящим предложенным значением свойства. Вы не должны принимать это. Ваша задача в свойстве set
состоит в том, чтобы проверить входящее значение и поместить его в вспомогательное поле, если вам это нравится ... или может быть добавить что-то еще, если вы этого не сделаете. Изменение входящего value
редко что вы хотите сделать. Вы почти правильно поняли ... вот исправленное замечание:
public string Title
{
get { return title; }
set {
if (value == "Hello")
{
//value = "ERROR"; //--> this only changes the incoming value
title = "ERROR"; //--> this sets your backing field
} else
{
title = value;
}
}
}
}
Сказав все это, нередко можно увидеть, как конструктор устанавливает только резервные поля, а не проходит через иногда дорогой проверочный код свойства set
. Часто это свойство public API для пользователей вашего типа для установки значения ... в то время как конструктор остается внутренним или закрытым и используется только для заполнения значений, которые были сохранены где-то .. как в базе данных. Хорошая идея? Может быть, а может и нет. Как вы только что обнаружили, обход свойства set
может привести к ошибкам.