• Q:
    возвращать коллекции/передавать в качестве параметров. Читаю FDG и запутался совсем. Не подскажите годные правила по этому поводу?

    A:
    Передавать:
    если коллекция будет храниться — можно передавать что угодно, конструктор всё равно должен будет сделать копию, чтобы не нарваться на изменение коллекции снаружи класса. Исключение — обёртки типа ReadOnlyCollection<T>.

    Если коллекция будет обрабатываться — принимать IEnumerable<T>, если нельзя — по обстоятельствам.

    Возвращать:
    Свойства — или ReadOnlyCollection<T>, или свой наследник от Collection<T> (для сложных моделей c доступными для редактирования коллекциями типа контролов в форме, столбцов в таблице и т.п.)

    Методы — или Enumerable<T>, или массив (если нужна копия на данный момент времени)

    разумеется, всё что выше — это просто общие рекомендации, а не обязательное "так и не иначе".

    ----

    Q: ога, пока все согласуется. Рассмотрим ближе — "Методы — или Enumerable<T>, или массив (если нужна копия на данный момент времени)". 1. В скобках не совсем понял — что имелось в виду

    A: ну смотрите:

    var someItems = list.Select(l=>l);

    foreach(var i in someItems) list.Remove(i);

    — получаете исключение (list изменился во время перебора)

    чтобы не зависеть от изменения исходной коллекции — проще получить копию ( list.Select(l=>l).ToArray(); )

    Q:
    по Enumerable<T> Q: получается жеж что конфликтует с тем что ниже, или я чтото думаю не так?;)

    DO NOT use IEnumerator<T>, IEnumerator, or any other type that
    implements either of these interfaces, except as the return type of a
    GetEnumerator method.

    " ANTHONY MOORE I've seen a lot of violations of this guideline ever
    since LINQ has been available. The review body made an explicit decision
    that LINQ should not change this guideline. Your callers can end up with a
    clumsy object model if they choose not to use LINQ or use a language that
    does not support it. "

    Types returning enumerators from methods other than GetEnumerator
    cannot be used with the foreach statement.

    A:> IEnumerator, не IEnumerable !
    Передавать Enumerator куда попало — это всё равно, что передавать DataReader/поток и удивляться "а кто это прочитал мои данные?";)

Replies (0)