我创建了两个不同的类。一类继承自 IList,另一类继承自 ObservableCollection。当我们为这些类创建实例时,我得到了以下结果。
继承自 IList
dput()
为 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();
}
}
实例不维护 Observable 集合,只维护计数
你能解释一下两者的区别吗?
答案 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>
上设置此属性,您将看到相同的调试标签。