簡體   English   中英

ObservableCollection 和 IList 繼承的類的區別

[英]Difference between the classes inherited from ObservableCollection and IList

我創建了兩個不同的類。 一類繼承自 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 維護的實例

為 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 集合維護實例,只維護計數

不為 Observable 集合維護實例,只維護計數

你能解釋一下兩者的區別嗎?

調試器使用類型注釋的調試器屬性
如果類型不使用這些屬性,則調用該類型的ToString()方法以獲取文本表示。

ObservableCollection使用這些方法之一來顯示Count 您自己的List實現不執行這些操作,因此調用基本ToString()方法,該方法僅返回類型名稱。

因此,要為您自己的類型獲得類似的結果,請實現ToString()或使用DebuggerDisplayAttribute注釋您的CellCollection類。

當光標懸停在變量上時,您可以看到變量名稱和實例的調試標簽。

默認情況下,調試標簽是ToString的結果。 對於類CellList ,方法ToString來自基類Object並返回類的名稱。 此顯示: CellList

屬性DebuggerDisplay允許定義實例的調試標簽(不是字符串)。 CellCollection繼承自ObservableCollection<T>不是繼承自Collection<T>並且類 Collection 是用屬性 DebuggerDisplay 聲明的

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

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

如果您在類CellList上設置此屬性,您將看到相同的調試標簽。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM