当我从它派生时,为什么我不能访问List <t>的类内部?</t>

时间:2009-08-10 21:06:43

标签: c# .net inheritance list

class NewList<T> : List<T>

为什么我无法访问T[] _items之类的内部结构?

为什么他们不受保护,而是私人?

我应该使用合成吗?

5 个答案:

答案 0 :(得分:7)

他们是私密的,因为作者(微软)并不打算让您访问它们,可能出于安全原因。

您应该使用合成而不是继承。让您的课程直接展示IList<T>而不是List<T>

永远不应该在公共API中直接公开

List<T>(这实际上是在设计指南中指定的)。它应仅用作内部实现细节。

答案 1 :(得分:2)

List<T>并非设计为基类。您应该使用System.Collections.ObjectModel中的一个类来代替。

答案 2 :(得分:1)

  

为什么我无法访问它的内部结构   T [] _items等?

Reflector说_items是私有的。下划线表明私人成员

  

为什么他们不受保护,但是   私人?

对于_items,Microsoft提供了公共ToArray方法。它返回_items。

答案 3 :(得分:1)

根据设计,暴露成员只有在(绝对)必要时才能完成,让对象始终保持正确的状态。并且将字段(_items)公开为受保护属性并不是一个好主意,这需要受保护的属性。在这种情况下,已经存在公共财产(this [])

组合将为您提供更少的访问权限 - 也没有受保护的成员。

答案 4 :(得分:0)

你不需要它。也就是说,使用_itemsItem : T属性无法做什么可以做什么?他们使用索引器为底层数组提供了一个简单的功能抽象。它的重量非常轻 - 只需检查边界并增加列表的版本(在设置器上)......

var lst = new List<int>() { 1, 2, 3, 4, 5 };
lst[0].Dump(); // 1
lst.Dump(); // 1, 2, 3, 4, 5
lst[0] = 2;
lst.Dump(); // 2, 2, 3, 4, 5