當實現了列表屬性的設置(在C#),它是一個不好的事,可以作爲:目錄的屬性設置
private List<string> _TheList = new List<string>();
public List<string> TheList
{
get { return _TheList; }
set { _TheList = value; }
}
如果它不能寫成:
private List<string> _TheList = new List<string>();
public List<string> TheList
{
get { return _TheList; }
set { _TheList = new List<string>(value); }
}
最多直到今天我通常使用前者,但是最近我發現了一些使用後者的代碼,似乎這可能是實現這一點的正確方法。
不會使用前者會在更改分配給它的外部列表時更改TheList屬性。例如:
List<string> list = new List<string>();
list.Add("Hello");
var c = new someClass();
c.TheList = list;
使用前將不會在下面的代碼打破的thelist的封裝:
list.Clear();
現在c.TheList也是空的,這可能不是我們想要的。但是,使用後一種方法,c.TheList不會被清除。
不,第二種解決方案是不正確的。使用第一個解決方案,如果你想設置一個副本,而不是一個參考 - 寫c.TheList =新列表(列表); –
vorrtex
2010-12-09 16:51:52
這取決於你的所有權語義。一些呼叫者可能期望能夠設置列表並且仍然「從外部」更新它。無論你採取哪種方式,都要確保將其適當記錄下來。 – 2010-12-09 16:52:01
感謝所有偉大的答案。我很高興沒有先檢查就沒有開始使用第二種方法。似乎共識是不提供二傳手(在大多數情況下)或至少使其受到保護。 – mikesigs 2010-12-09 17:19:13