ole*_*sii 7 .net c# collections interface
Q1为什么.NET中的新类仅部分实现接口?
Q2我应该在我的代码中做同样的事情吗?
我在这里问了这个问题,所以我想,好吧很久以前,你可以有不同的用法等等,现在这种实现只是出于一致性的原因而受到支持.但新课程也是如此.
旧
int[] list = new int[] {};
IList iList = (IList)list;
ilist.Add(1); //exception here
Run Code Online (Sandbox Code Playgroud)
新
ICollection c = new ConcurrentQueue<int>();
var root = c.SyncRoot; //exception here
Run Code Online (Sandbox Code Playgroud)
UPDATE
我不担心为什么我得到例外,很明显.但我不明白为什么类实现明确定义的合同,而不是所有成员(这可能导致令人不快的运行时异常)?
您可能会说原始设计中的界面不够精细。例如,大多数人从未使用过 SyncRoot- 它可能位于不同的界面上。同样,不幸的是没有接口提供只读索引器访问等。
就目前情况而言,接口就是它们的样子。尽管如此,实现主IList[<T>]//接口仍然非常方便 - 它为大多数调用者提供了对他们所需内容的访问......因此第一个示例和第二个示例中的索引ICollection[<T>]器。IEnumerable[<T>]Add
公平地说,他们确实还提供IsFixedSize和IsReadOnly- 查询第一个会导致您不会打电话Add。重新SyncRoot- 这在内部可能没有意义ConcurrentQueue<T>,任何实现都会破坏类型的逻辑。通常我会说“那么它不是那种类型;不要实现接口”,但重复我之前的声明...... 大多数人从不使用SyncRoot- 所以我同意它;p