Pull to refresh

Comments 8

Возможно, глупый вопрос, но почему ICollection, а не IList? Какие вообще преимущества у коллекции перед списком? Никак не могу найти сравнительную таблицу всех этих списочно-коллекционных сущностей в дотнете.
А таблицу и не нужно искать. Просто посмотрите имплементации одного интерфейса и другого.
public interface ICollection<T> : IEnumerable<T>, IEnumerable
{
    int Count { get; }
    bool IsReadOnly { get; }
 
    void Add(T item);
    void Clear();
    bool Contains(T item);
    void CopyTo(T[] array, int arrayIndex);
    bool Remove(T item);
}


public interface IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable
{
    T this[int index] { get; set; }
 
    int IndexOf(T item);
    void Insert(int index, T item);
    void RemoveAt(int index);
}


IList наследуется от ICollection, и поддерживает все тоже самое + индексация объектов в коллекции. Т.е. если вам важен порядок объектов в коллекции используйте IList, если порядок не важен и вы нигде не обращаетесь по его индексу ( вставляете/удаляете по индексу), то используйте ICollection. Смысл в том, чтобы не использовать, то что не нужно.
Спасибо, примерно так и думал. Но почему бы и не использовать IList на всякий случай, мало ли как жизнь сложится. Минусов ведь никаких?
затем чтобы не закладывать лишних ограничений без необходимости. поменять на IList вы сможете всегда, а вот завязавшись на его методы, обратно путь будет сложнее.
Поэтому, наверно, и таблиц нет.
С точки зрения клиента библиотеки, лучше ICollection, т.к. есть маневр для выбора типа коллекции.

Но, с точки зрения разработчика библиотеки, раз пообещав ICollection, уже нельзя захотеть принимать IList, чтобы не сломать совместимость со всем уже написанным сторонним кодом. Поэтому, если есть предположение, что для будущей функциональности пригодится произвольный доступ, может быть удобнее заранее потребовать более сильные условия, чтобы клиенты изначально рассчитывали на эти условия.
Спасибо за описание. Много чего интересного для себя почерпнул.
Sign up to leave a comment.