Чтобы ответить на «почему» часть вопроса, почему не _ 1_, Причины - ориентированность на будущее и простота API.
Ориентация на будущее
List<T>
не предназначен для простого расширяемый, создавая подклассы; он разработан, чтобы быть быстрым для внутреннего внедрения. Вы заметите, что методы на нем не виртуальные и поэтому не могут быть переопределены, и в его _ 3_ / _ 4_ / _ 5_ операций.
Это означает, что если вам нужно изменить поведение коллекции в будущем (например, чтобы отклонить нулевые объекты, которые люди пытаются добавить, или для выполнения дополнительной работы, когда это происходит, например, обновления состояния вашего класса), вам необходимо изменить тип коллекции, которую вы возвращаете к тому, который вы можете подклассифицировать, что будет критическим изменением интерфейса (конечно, изменение семантики таких вещей, как запрет на null, также может быть изменением интерфейса, но такие вещи, как обновление вашего внутреннего состояния класса, не будут).
Таким образом, возвращая любой класс, который можно легко разделить на подклассы, например Collection<T>
или такой интерфейс, как IList<T>
, _8 _ или IEnumerable<T>
, вы можете изменить свой внутренняя реализация должна быть другим типом коллекции для удовлетворения ваших потребностей, не нарушая кода потребителей, потому что он все еще может быть возвращен как тип, который они ожидают.
Простота API
List<T>
содержит множество полезных операций. например BinarySearch
, _ 12_ и так далее. Однако, если вы раскрываете эту коллекцию, вполне вероятно, что вы контролируете семантику списка, а не потребителей. Таким образом, хотя вашему классу внутри могут потребоваться эти операции, очень маловероятно, что потребители вашего класса захотят (или даже должны) их вызвать.
Таким образом, предлагая более простой класс коллекции или интерфейс, вы уменьшаете количество членов, которые видят пользователи вашего API, и упрощаете им использование.
person
Greg Beech
schedule
07.11.2008