我有一些遗留的 C# 代码,其中包含以下部分:
private List<MyClass> mList = new List<MyClass>();
public List<MyClass> getList()
{
List<MyClass> list = new List<MyClass>();
list.AddRange(mList);
return list;
}
不确定这里 AddRange
的目的是什么?我可以将其重写为:
public List<MyClass> getList()
{
return mList;
}
最佳答案
没有。
如果你简单地使用 return mlist
, 你返回 mlist
实例,而原始代码返回它的浅拷贝。
假设你的类看起来像这样:
class Foo
{
public Foo()
{
mList.Add(1);
}
private List<int> mList = new List<int>();
public List<int> getList()
{
List<int> list = new List<int>();
list.AddRange(mList);
return list;
}
}
现在你跑
var x = new Foo();
x.getList().Add(2);
x.getList().Add(3);
mList
的内容还是会单例1
,因为调用 getList
退还副本 mList
,而不是列表本身。
如果您像在问题中那样更改代码,您将更改 mList
它现在将包含元素 1
, 2
, 和 3
.
从方法名称中看不出是否返回了副本,因此您可能希望将其更改为类似于 GetListCopy
的名称(在这种情况下,该方法可以简单地返回 new List<MyClass>(mList)
或 mList.ToList()
),或者将列表作为 IReadOnlyList
返回以明确列表不应更改。
public IReadOnlyCollection<MyClass> getList()
{
return mList.AsReadOnly();
}
关于c# - AddRange 授予公众访问列表的权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33211324/