如果我想存储类作为参数传递的列表,我应该使用什么参数类型?
我应该使用 IEnumerable 并做类似
Items = items.ToList().AsReadOnly()
的事情吗?但是如何避免多余的副本呢?如果列表是在构造函数调用中创建的,那肯定是 ToList()
太多了。
在 C++ 中,我将有一个非引用参数来确保传递列表的副本,但 AFAIK 在 C# 中这是不可能的。
如果您不想修改传递给类中构造函数的列表,则可以将参数定义为
IReadOnlyList<T>
并通过在原始列表上调用AsReadOnly()
来传递它。您仍然会使用相同的列表,但是 AsReadOnly()
提供了一个包装器来防止修改,根据 documentation:
public class YourClass
{
private IReadOnlyList<SomeType> yourList;
public YourClass(IReadOnlyList<SomeType> list)
{
yourList = list;
}
}
然后调用构造函数如下:
var someList = new List<SomeType>();
var yourClassInstance = new YourClass(someList.AsReadOnly());
您仍然可以更改原始列表引用,它将反映在只读引用中,因为它们实际上访问的是同一个列表,但是您将无法修改里面的列表
YourClass
.
或者,如果你不能在外部调用
AsReadOnly()
,那么你需要在你的构造函数中调用它,这在技术上允许你的类在存储只读引用之前进行修改:
public class YourClass
{
private IReadOnlyList<SomeType> yourList;
public YourClass(IList<SomeType> list)
{
yourList = list.AsReadOnly();
}
}
如果确实需要修改传递的列表,则需要复制一份。