如果不想修改传递给类中构造函数的列表,那么可以将参数定义为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();
}
}
如果您确实需要修改传递的列表,您将需要创建一个副本,然后YourClass
将获得该副本的所有权:
public class YourClass
{
private IList<SomeType> yourList;
public YourClass(IList<SomeType> list)
{
yourList = new List<T>(list);
}
}
由于被调用者本身无法知道是否应该复制,因此您可以向构造函数添加一个可选标志,以将责任转移给调用者:
public class YourClass
{
private IList<SomeType> yourList;
public YourClass(IList<SomeType> list, bool makeCopy = false)
{
yourList = makeCopy ? new List<T>(list) : list;
}
}
这样,调用方必须决定是否需要复制:
var someList = new List<SomeType>();
//Make a copy explicitly
var yourClassInstance1 = new YourClass(someList, true);
//Do not make a copy
var yourClassInstance2 = new YourClass(new List<SomeType>{ object1, object2 });