Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Возможно многократное перечисление предупреждения IEnumerable с помощью .GetType()

Автор вопроса: rhe1980Ответов: 2

Я получаю предупреждение ReSharper "Возможно множественное перечисление IEnumerable" со следующим кодом:

public void Mymethod(IEnumerable<int> entities)
{
   var enumerator = entities.GetEnumerator();
   var entityType = entities.GetType();
}

Как и во многих описанных темах stackoverflow (а также на http://confluence.jetbrains.net/display/ReSharper/Possible+multiple+enumeration+of+IEnumerable) ReSharper распознает, что запрос выполняется дважды.

Мой вопрос в том, почему оператор "GetType()" распознается как запрос.

Любое предложение?

заранее спасибо.

  • Я почти уверен, что это относится к строке enumerator. Вероятно, он ищет соответствующий Dispose() вызов. Jeff Mercado 17.01.2012
  • Я получаю предупреждение для обоих утверждений. Это также происходит, если я вызываю .GetType() только два раза вместо .GetEnumerator(). rhe1980 17.01.2012
  • Я отправил это как проблему в систему отслеживания ошибок ReSharper AakashM 22.02.2012
  • @AakashM: спасибо за отправку, но трекер. похоже ошибка будет исправлена ​​в следующей версии. Жду обновления ;-) rhe1980 29.02.2012

linqresharperenumeratorgettype

Ответы

Ответ 1 · рейтинг 3 · porges

Просто Resharper недостаточно умен. GetType не является виртуальным методом, он не может повлиять на IEnumerable.

Ответ 2 · Fredrik Mörk

Чтобы GetTypes был вызван, entities нужно будет оценить с точки зрения ReSharper (он не знает, потребует ли GetTypes вычисление перечисления, поэтому он говорит "возможно множественное перечисление "). Поскольку ReSharper видит, что в методе есть несколько мест, где у вас есть один и тот же сценарий, он выдает это предупреждение.

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы