以下代码的设计使得如果更改分配给一个节点的数组,它不会影响其他节点。将数组存储在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