Реализация коллекции с использованием другой коллекции - PullRequest
3 голосов
/ 13 февраля 2012

Часто вам приходится реализовывать коллекцию, потому что ее нет среди таковых .NET Framework.В примерах, которые я нахожу в Интернете, часто новая коллекция создается на основе другой коллекции (например, List<T>): таким образом можно избежать управления изменением размера коллекции.

public class CustomCollection<T>
{
    private List<T> _baseArray;

    ...

    public CustomCollection(...)
    {
        this._baseArray = new List<T>(...);
    }
}
  1. Каковы недостатки использования этого подхода?Только более низкая производительность из-за вызовов метода для базовой коллекции?Или компилятор выполняет некоторую оптимизацию?
  2. Более того, в некоторых случаях поле, относящееся к базовой коллекции (например, приведенное выше _baseArray), объявляется как readonly.Почему?

Ответы [ 3 ]

3 голосов
/ 13 февраля 2012
  1. Основным недостатком является то, что если вы хотите играть хорошо, вам придется реализовать множество интерфейсов вручную (ICollection, IEnumerable, возможно, IList ... как универсальный, так и не универсальный),это довольно много кода.Не сложный код, так как вы просто переводите вызовы, но все же код.В большинстве случаев дополнительный вызов во внутренний список не должен иметь большого значения.
  2. Это сделано для того, чтобы обеспечить тот факт, что после установки внутреннего списка его нельзя изменить в другой список.

Обычно лучше наследовать от одного из множества встроенных классов коллекций, чтобы создать собственную коллекцию, а не делать это сложным образом.Collection<T> - хорошая отправная точка, и никто не мешает вам наследовать List<T>.

2 голосов
/ 13 февраля 2012

Для # 2: если закрытый член назначен только в конструкторе или когда объявлен, это может быть readonly.Обычно это верно, если у вас есть только одна базовая коллекция, и вам никогда не нужно ее воссоздавать.

0 голосов
/ 13 февраля 2012

Я бы сказал, что существенным недостатком этого подхода является то, что вы не можете использовать LINQ в своей пользовательской коллекции, если не внедрили IEnumerable. Лучшим подходом может быть создание подкласса и принудительное использование новой реализации методов, например:

public class FooList<T> : List<T>
{
    public new void Add(T item)
    {
        // any FooList-specific logic regarding adding items
        base.Add(item);
    }
}

Что касается ключевого слова readonly, это означает, что вы можете установить переменную только в конструкторе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...