添加到构造函数中的只读集合
本文关键字:只读 集合 构造函数 添加 | 更新日期: 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()));