Подтвердить что ты не робот

Когда это плохая форма для возврата отложенного IEnumerable <T>

Мне любопытно, есть ли у кого-нибудь какие-либо правила или лучшие практики, когда имеет смысл вернуть отложенный IEnumerable<T> или вызвать ToArray() на нем, прежде чем возвращать его из функции.

Например, как потребитель API, я считаю, что для метода, такого как IEnumerable<Widget> GetWidgets(), я бы предпочел бы выбросить HttpException, когда я его вызову, и не заставлять его бросать, когда я перечисляю результаты.

public IEnumerable<Widget> GetWidgets(IEnumarable<int> widgetIds) {
    return widgetIds.Select(id => GetWidgetFromWidgetWebService(id));
}
4b9b3361

Ответ 1

Я всегда предпочитаю возвращать отложенную IEnumerable<T>, когда нет значительных побочных эффектов от ее отсрочки. Если перечислимое основано на внутренней коллекции, которая может, вероятно, измениться, например, я бы предпочел сначала ее оценить.

Однако, если вычисляемый счетчик вычисляется и т.д., я обычно откладываю его.

Ответ 2

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

В конце концов, метод не заполнил то, что объявляет его название, поэтому он должен бросить.

Я обычно изменяю тип возврата на IList<T> в таких случаях, чтобы документировать, что он выполняется с нетерпением.