【问题标题】:Difference between the classes inherited from ObservableCollection and IList从 ObservableCollection 和 IList 继承的类之间的区别
【发布时间】:2021-09-07 22:29:29
【问题描述】:

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

继承自 IList

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

为 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 : ObservableCollection<OrderInfo>
{
    public CellCollection()
    {

    }


}


不为 Observable 集合维护实例,仅维护 Count

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

【问题讨论】:

    标签: c# wpf list mvvm observablecollection


    【解决方案1】:

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

    默认情况下,调试标签是ToString 的结果。对于您的类CellList,方法ToString 来自基类Object 并返回类的名称。此显示:CellList

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

    [DebuggerDisplay("Count = {Count}")]    
    public class Collection<T>: IList<T>, IList, IReadOnlyList<T>
    

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

    如果您在类CellList 上设置此属性,您将看到相同的调试标签。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-01-05
        • 2011-10-25
        • 2014-04-29
        • 1970-01-01
        • 2010-10-26
        • 2016-07-30
        相关资源
        最近更新 更多