ObservableCollection 和 IList 继承的类的区别

时间:2021-06-24 12:13:03

标签: c# wpf list mvvm observablecollection

我创建了两个不同的类。一类继承自 IList,另一类继承自 ObservableCollection。当我们为这些类创建实例时,我得到了以下结果。

继承自 IList

dput()

Instance maintained for IList

为 IList 维护的实例。

继承自 ObservableCollection

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Cells = new CellCollection();
    }

    private CellCollection cells;

    public CellCollection Cells
    {
        get { return cells; }
        set { cells = value; }
    }
}

public class CellCollection : IList<OrderInfo>
{
    public CellCollection()
    {
    }

    public OrderInfo this[int index] { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }



    public bool IsReadOnly => throw new NotImplementedException();

    public int Count => throw new NotImplementedException();

    public void Clear()
    {
        throw new NotImplementedException();
    }

    public bool Contains(OrderInfo item)
    {
        throw new NotImplementedException();
    }

    public void CopyTo(OrderInfo[] array, int arrayIndex)
    {
        throw new NotImplementedException();
    }

    public IEnumerator<OrderInfo> GetEnumerator()
    {
        throw new NotImplementedException();
    }

    public int IndexOf(OrderInfo item)
    {
        throw new NotImplementedException();
    }

    public void Insert(int index, OrderInfo item)
    {
        throw new NotImplementedException();
    }

    public bool Remove(OrderInfo item)
    {
        throw new NotImplementedException();
    }

    public void RemoveAt(int index)
    {
        throw new NotImplementedException();
    }

    internal void Add(OrderInfo orderInfo)
    {
        
    }

    void ICollection<OrderInfo>.Add(OrderInfo item)
    {
        throw new NotImplementedException();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        throw new NotImplementedException();
    }
}

Instance not maintained for Observable collection, Count only maintained

实例不维护 Observable 集合,只维护计数

你能解释一下两者的区别吗?

2 个答案:

答案 0 :(得分:1)

调试器使用 debugger attributes 注释类型。
如果类型不使用这些属性,则调用该类型的 ToString() 方法以获取文本表示。

ObservableCollection 使用这些方法之一来显示 Count。您自己的 List 实现不执行这些操作,因此会调用基本 ToString() 方法,该方法仅返回类型名称。

因此,要为您自己的类型获得类似的结果,请实现 ToString() 或使用 CellCollection 注释您的 DebuggerDisplayAttribute 类。

答案 1 :(得分:1)

当光标悬停在变量上时,可以看到变量名和实例的调试标签。

默认情况下,调试标签是 "tokens" : [ { "token" : "some", "start_offset" : 0, "end_offset" : 4, "type" : "word", "position" : 0 }, { "token" : "some.test", "start_offset" : 0, "end_offset" : 9, "type" : "word", "position" : 0 }, { "token" : "some.test.domain", "start_offset" : 0, "end_offset" : 16, "type" : "word", "position" : 0 }, { "token" : "some.test.domain.com", "start_offset" : 0, "end_offset" : 20, "type" : "word", "position" : 0 } ] } { "tokens" : [ { "token" : "some.test.domain.com", "start_offset" : 0, "end_offset" : 20, "type" : "word", "position" : 0 }, { "token" : "test.domain.com", "start_offset" : 5, "end_offset" : 20, "type" : "word", "position" : 0 }, { "token" : "domain.com", "start_offset" : 10, "end_offset" : 20, "type" : "word", "position" : 0 }, { "token" : "com", "start_offset" : 17, "end_offset" : 20, "type" : "word", "position" : 0 } ] } 的结果。对于您的类 ToString,方法 CellList 来自基类 ToString 并返回类的名称。此显示:CellList

属性 DebuggerDisplay 允许定义实例的调试标签(不是字符串)。类 Object 继承自 CellCollection 而不是继承自 ObservableCollection<T>the class Collection is declared with the attribute DebuggerDisplay

Collection<T>

.NET 中的所有集合都是一样的,比如 List。

如果您在类 [DebuggerDisplay("Count = {Count}")] public class Collection<T>: IList<T>, IList, IReadOnlyList<T> 上设置此属性,您将看到相同的调试标签。