【发布时间】:2010-11-18 10:29:59
【问题描述】:
class NewList<T> : List<T>
为什么我不能访问它的内部结构,如 T[] _items 等?
为什么它们不受保护,而是私有的?
我应该为此使用合成吗?
【问题讨论】:
-
我在这里遗漏了什么吗? T[] _items 似乎是 List
的私有成员,即使没有继承也无法直接访问。组合在这里有什么帮助?
标签: c# .net inheritance list
class NewList<T> : List<T>
为什么我不能访问它的内部结构,如 T[] _items 等?
为什么它们不受保护,而是私有的?
我应该为此使用合成吗?
【问题讨论】:
标签: c# .net inheritance list
List<T> 并非设计为基类。您应该改用System.Collections.ObjectModel 中的类之一。
【讨论】:
它们是私有的,因为作者(Microsoft)不打算让您访问它们,可能是出于安全原因。
您应该使用组合而不是继承。让您的班级直接公开IList<T> 而不是List<T>。
List<T> 不应该直接暴露在公共 API 中(这实际上是在设计指南中指定的)。它只能用作内部实现细节。
【讨论】:
为什么我不能像访问它的内部一样 T[] _items 等?
Reflector 说 _items 是私有的。下划线表示私有成员
为什么它们不受保护,但是 私人的?
对于 _items,Microsoft 提供了公共 ToArray 方法。它返回 _items。
【讨论】:
这是设计使然,仅在(绝对)必要时才公开成员,以让对象始终保持正确的状态。将字段 (_items) 公开为受保护的不是一个好主意,这需要受保护的属性。在这种情况下,已经有一个公共属性(this[])
Composition 将给您更少的访问权限 - 也没有受保护的成员。
【讨论】:
你不需要它。也就是说,你可以用_items 做什么而你不能用Item : T 属性做什么?他们使用索引器为您提供了对底层数组的简单功能抽象。它的重量很轻——它所做的一切都是检查边界并增加列表的版本(在 setter 上)......
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
【讨论】:
ref 参数传递给外部代码或Interlocked.CompareExchange 等方法; (2) 对于继承List<someValueType>的类型,访问项目的各个字段(包括修改它们或将它们作为ref参数传递)。