以下代碼的設計使得如果更改分配給一個節點的數組,它不會影響其他節點。將數組存儲在c#數據結構中,使其具有類似於數值結構的行爲
我的問題是:是否有一個更「地道」的方式來完成這個?
void Main()
{
var arr = new [] { 1, 2, 3 };
var node1 = new Node();
node1.Children = arr;
var node2 = new Node();
node2.Children = arr;
node1.Children[0] = 9; // node2 SHOULD NOT be affected by this
node1.Dump();
node2.Dump();
}
class Node
{
private int[] children;
public int[] Children
{
get { return children; }
set
{
children = new int[value.Length];
value.CopyTo(children, 0);
}
}
}
爲什麼要公開陣列?考慮一下'List'或者其他一些集合......甚至是'IEnumerable'。數組很難跟蹤,因爲您可以修改現有數組中的值。你的示例看起來像你試圖構建不可變樹 - 暴露陣列不會削減它。 –
我不會推薦*那*特殊的方法。想想最不驚奇的原則。我會發現它非常令人驚訝,看到Main中的代碼不會導致Node的每個實例中的數組的第一個元素具有9作爲值。我可能會選擇完全封裝數組並將方法暴露出來。 –
是否「節點」對現有「模板」的引用時間儘可能長,然後僅在需要時才創建_copy_?例如爲了記憶的目的?我至少要在'Node'上創建一個屬性,用於指示底層存儲是否爲_the_模板,例如'IsStillUsingTemplate'(需要在您的'Children'' set'處設置爲'FALSE')。如果可行的話,我會創建一個獲得'增強'存儲的方法,因此調用者必須在測試'IsStillUsingTemplate'後明確地做到這一點(但如果它需要透明,可能會破壞你想做的事情)。 – Sepster