当列表保存在类中时,IEnumerable 作为构造函数参数

问题描述 投票:0回答:1

如果我想存储类作为参数传递的列表,我应该使用什么参数类型?

我应该使用 IEnumerable 并做类似

Items = items.ToList().AsReadOnly()
的事情吗?但是如何避免多余的副本呢?如果列表是在构造函数调用中创建的,那肯定是
ToList()
太多了。

在 C++ 中,我将有一个非引用参数来确保传递列表的副本,但 AFAIK 在 C# 中这是不可能的。

c# list parameter-passing
1个回答
0
投票

如果您不想修改传递给类中构造函数的列表,则可以将参数定义为

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();
    }
}

如果确实需要修改传递的列表,则需要复制一份。

© www.soinside.com 2019 - 2024. All rights reserved.