C#项未添加到List <String>

use*_*520 0 c# interface list data-structures

下面是我对Azure的ICollector接口的实现.

class TestCollector<T> : ICollector<T>
{
    public List<T> Collector => new List<T>();

    public void Add(T item)
    {
        Collector.Add(item);
    }
}
Run Code Online (Sandbox Code Playgroud)

在TestCollector上添加项目时,收集器的计数仍保持为0.

它没有被添加的原因是什么?我应该为TestCollector创建一个单独的构造函数并在里面初始化Collector吗?

Baf*_*our 7

以下是错误的

public List<T> Collector => new List<T>();    
Run Code Online (Sandbox Code Playgroud)

箭头函数是方法的简写语法.你写的内容相当于以下内容:

public List<T> Collector()
{
    return new List<T>();
}
Run Code Online (Sandbox Code Playgroud)

因此,每次调用Collector时,都会返回一个新列表,向其中添加一个项目,然后不再引用该列表.

如果您需要一个字段,请将其替换为:

public List<T> Collector = new List<T>();    
Run Code Online (Sandbox Code Playgroud)

编辑:我错过了你需要收集器方法来实现你的界面的事实.在这种情况下,初始化字段中的列表,然后在您的Collector实现中返回它可能是有意义的,如下所示:

class TestCollector<T> : ICollector<T>
{
    private List<T> Collector _collector = new List<T>();
    public List<T> Collector => _collector;

    public void Add(T item)
    {
        _collector.Add(item);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 具有初始化程序的只读自动属性是一种更清洁(和更清晰)的IMO.虽然最终结果几乎相同:`public List <T> Collector {get; } = new List <T>();`如果你要保持它的方式,我可能会访问`Add`方法中的字段而不是属性 (2认同)

AAA*_*ddd 5

您每次都在创建一个新列表

不要这样做

public List<T> Collector => new List<T>();
Run Code Online (Sandbox Code Playgroud)

做这个

public List<T> Collector = new List<T>();
Run Code Online (Sandbox Code Playgroud)

要么

public List<T> Collector { get; } = new List<T>();
Run Code Online (Sandbox Code Playgroud)