添加到构造函数中的只读集合

本文关键字:只读 集合 构造函数 添加 | 更新日期: 2023-09-27 18:35:03

是否有允许我将项添加到构造函数中的只读集合属性的 C# 语言构造? 我想做这样的事情:

public class Node{
    public IList<Node> Children {get; protected set;}
    public Node(){
        Children = new ObservableList<Node>();
    }
}

。在我的代码中某处...

var node = new Node {Children.Add(new Node())};

(不是一个很好的例子,但我希望这能传达这个想法(...

更新

好的,对不起,我需要更清楚。 这门课不是我写Node的,我无法改变它。 我问是否有一个 c# 语言概念允许我在第二个代码段的无参数构造函数中添加只读集合,假设 Node 类不可更改。

添加到构造函数中的只读集合

试试这个。绝对可以在建筑中添加元素

var node = new Node
 {
     Children =
    {
        new Node(),
        new Node()
    }
 };
如果你有一个 List 类型的属性,该属性仅

get,这仅意味着您无法设置该属性,您仍然可以向列表中添加内容。

但是,您可以改为公开 IEnumerable 属性,并拥有一个采用列表(或更有可能IEnumerable另一个(的构造函数。

属性

初始值设定项不起作用,因为编译器只会将它们重写为常规属性赋值。

我会这样做:

public class Node{
    public IEnumerable<Node> Children {get; private set;}
    public Node(IEnumerable<Node> children){
        Children = children.ToList();
    }
}

如果你不能改变Node类,我建议编写一个类似于这样的帮助程序类:

public static Node Create(IEnumerable<Node> children)
{
    var n = new Node();
    foreach (var c in children)
        n.Children.Add(c);
     return n;
}

要使用第二个代码片段中的集合初始值设定项语法,您的 Node 类必须实现 IEnumerable 并具有带有签名的公共方法

void Add(Node child)

因此,这样的类不能提供你想要的不变性。我认为解决您问题的最佳方法是这样做

public class Node
{
  public readonly IEnumerable<Node> Children;
  public Node(IEnumerable<Node> children)
  {
    Children = children;
  }
}

或者,如果您不喜欢 IEnumerable 的延迟执行:

public class Node
{
  public readonly ReadOnlyCollection<Node> Children;
  public Node(IEnumerable<Node> children)
  {
    Children = new ReadOnlyCollection<Node>(children);
  }
}

您可以将支持字段添加到"子"属性,然后在构造期间填充支持字段。

这样

public class Node
        {
            private IList<Node> _Children;
            public IList<Node> Children { get { return _Children; } }
            public Node(IList<Node> children)
            {
                _Children = children;
            }
        }

然后你可以这样做

var node = new Node((new ObservableList<Node>()).Add(new Node()));