2 回答

TA貢獻1946條經驗 獲得超3個贊
這里發生了一件有趣的事情,即使是經驗豐富的開發人員偶爾也會絆倒……而且它忽略了支持字段和屬性之間的區別。這種情況時有發生......并且絕對讓開發人員感到困惑,直到他們意識到他們已經犯了一個 Visual Studio 智能感知輔助錯誤。如果您將支持字段命名為與屬性名稱相同,則可能性會加倍......僅以防萬一。
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。很多時候,該屬性是您的類型的用戶設置值的公共API……而構造函數保持內部或私有,僅用于填充已保存在某處的值……例如一個數據庫。一個好主意?也許/也許不是。正如您剛剛發現的那樣,繞過該屬性set可能會給您留下一些可能是錯誤的東西。

TA貢獻1860條經驗 獲得超8個贊
您不應將“錯誤”分配給 Value 關鍵字。
值關鍵字是保存輸入。如果您想在為字段分配值之前執行驗證,這很有用。如果您將某些內容分配給 Value ,則該課程將不會保留該內容。
編輯-正如下面評論中提到的-您的代碼沒有使用屬性設置器,而是通過構造函數設置值。
你有兩個選擇——
選項 1 - 在構造函數中添加相同的驗證。
選項 2 - 在構造函數中設置屬性而不是字段
選項 2 對我來說更有意義,因為它避免了代碼重復。
您將不得不對標題屬性進行小幅更改
public string Title
{
get { return title; }
set {
if (value == "Hello")
{
title = "ERROR";
} else
{
title = value;
}
}
}
- 2 回答
- 0 關注
- 106 瀏覽
添加回答
舉報