C#: делегат Действия по сравнению с явным делегатом

более современное решение

, Если Вам не нужен внутренний набор, чтобы быть изменяемыми, Вы могли использовать System.Collections.Immutable пакет, изменить свой тип поля, чтобы быть неизменным набором и затем выставить это непосредственно - принятие Foo само неизменно, конечно.

Обновленный ответ для рассматривания вопроса более непосредственно

Является там какой-либо причиной выставить внутренний набор как ReadOnlyCollection, а не IEnumerable, если код вызова только выполняет итерации по набору?

Это зависит от того, насколько Вы доверяете коду вызова. Если Вы находитесь в полном контроле над всем, что будет когда-либо звонить этому участнику и Вам гарантия , который никогда не будет использовать никакой код:

ICollection evil = (ICollection) bar.Foos;
evil.Add(...);

затем уверенный, никакой вред не будет причинен, если Вы просто возвратите набор непосредственно. Я обычно пытаюсь быть более параноиком, чем это все же.

Аналогично, как Вы говорите: если Вы только [1 110] потребность IEnumerable, то, почему связь сами с чем-либо более сильным?

Исходный ответ

при использовании.NET 3.5 можно постараться не делать копию , и избегают простого броска при помощи простого вызова для Пропуска:

public IEnumerable Foos {
    get { return foos.Skip(0); }
}

(Существует много других опций для обертывания тривиально - хорошая вещь, которая приблизительно Skip по Выбору/Где - то, что нет никакого делегата для выполнения бессмысленно для каждого повторения.)

, Если Вы не используете.NET 3.5, можно записать очень простую обертку, чтобы сделать то же самое:

public static IEnumerable Wrapper(IEnumerable source)
{
    foreach (T element in source)
    {
        yield return element;
    }
}

6
задан MrLane 9 September 2009 в 05:12
поделиться

1 ответ

Вместо Action я использую EventHandler для любых объявлений событий. Это избавляет меня от необходимости определять собственный тип делегата. Он также имеет дополнительное преимущество, заставляя тип данных быть производным от System.EventArgs и, следовательно, хорошо работает с шаблонами событий .Net.

11
ответ дан 9 December 2019 в 22:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: