c# - AddRange 授予公众访问列表的权限

标签 c# .net generics properties

我有一些遗留的 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/

相关文章:

c# - 如何在 .net 可执行文件中引用类?

c# - 创建和处理 XmlNodeList

java - 泛型子类

java - 从泛型类型获取类对象

java - 如何检查 Fragment.onAttach() 内的类型化回调类型

c# - 为什么我需要显式转换来缩短三元运算符中的整数文字?

c# - 故障排除 : Why doesn't type inference fail here?

c# - WinForms Form_Load 未调用

c# - 我们如何在表单应用程序的标签中放置自定义日期格式?

c# - System.Drawing.dll 中出现“System.ArgumentException”