ReadOnlyCollection的实例化

时间:2017-08-31 16:40:34

标签: c#

我对ReadOnlyCollection的覆盖有问题。

我正在使用两个集合,一个将使用Access数据库填充,然后在ReadOnlyCollection中进行排序和复制 与

public static  List<ToponymeGeoDb> ListeToponymesGeoDb = new List<ToponymeGeoDb>();

public static ReadOnlyCollection<ToponymeGeoDb> roListeToponymesGeoDb = new ReadOnlyCollection<ToponymeGeoDb>(ListeToponymesGeoDb);

填充后,我用

传输数据
ToponymeGeoDb.roListeToponymesGeoDb =new ReadOnlyCollection<ToponymeGeoDb>(ToponymeGeoDb.ListeToponymesGeoDb);

在这个阶段,我的roListeToponymesGeoDb包含我的数据但是当我尝试在我的程序的另一部分使用它时它是空的!!

由于它被宣布为静态成员,我不明白发生了什么。

1 个答案:

答案 0 :(得分:0)

保留一个私有的项目列表,并公开IReadOnlyCollection的属性。

public struct Topo { }  

public class Foo
{
    // Private list of types. This is actual storage of the data.
    // It is inialized to a new empty list by the constructor.
    private List<Topo> InnerItems { get; } = new List<Topo>();

    // Example on how to modify the list only through this class
    // Methods have access to `InnerList`
    public void Add(Topo item) { InnerItems.Add(item); }

    // Outside of the class only `Items` is exposed
    // This poperty casts the list as a readonly collection
    public IReadOnlyCollection<Topo> Items => InnerItems;
}

class Program
{
    static void Main(string[] args)
    {
        var foo = new Foo();

        foo.Add(new Topo());

        // foo.Items.Add() doesnt exist.

        foreach(var item in foo.Items)
        {
            Console.WriteLine(item);
        }
    }
}

或者,您可以使用以下内容:

    public IReadOnlyList<Topo> Items => InnerItems;

这使您也可以通过索引访问结果。与第一项Items[0]类似。