Почему я не могу получить доступ к внутренним классам List <T>, когда я получаю от него?

class NewList<T> : List<T>

Почему я не могу получить доступ к внутренним элементам, например T[] _items и т.д.

Почему они не защищены, но закрыты?

Должен ли я использовать композицию для этого?

Ответ 1

Они частные, потому что автор (Microsoft) не собирался обращаться к ним, возможно, из соображений безопасности.

Вы должны использовать композицию вместо наследования. Сделайте свой класс открытым IList<T> вместо List<T> напрямую.

List<T> никогда не должен подвергаться прямому воздействию в публичном API (это действительно указано в руководящих принципах проектирования). Он должен использоваться только как внутренняя реализация.

Ответ 2

List<T> не предназначен для базового класса. Вместо этого вы должны использовать один из классов System.Collections.ObjectModel.

Ответ 3

Почему я не могу получить доступ к внутренним элементам T [] _items и т.д.?

Отражатель говорит, что _items является закрытым. Подчеркивание предлагает частный член

Почему они не защищены, но частный?

В случае _items Microsoft предоставляет общедоступный метод ToArray. Он возвращает _items.

Ответ 4

По замыслу, выставление членов выполняется только тогда, когда (абсолютно) необходимо, чтобы объект поддерживал правильное состояние во все времена. И не рекомендуется выделять поле (_items) как защищенное, для чего требуется защищенное свойство. В этом случае уже существует публичное свойство (это [])

Композиция даст вам еще меньше доступа - не защищенные члены.

Ответ 5

Вам это не нужно. То есть, что вы можете сделать с _items, что вы не можете сделать с свойством Item : 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