Как избавиться от предупреждений «Возможное исключение System.NullReferenceException» при использовании LINQ и ReSharper? - PullRequest
3 голосов
/ 15 сентября 2011

Допустим, у меня есть следующий код:

public class Deck {
  [NotNull IEnumerable<Card> cards = new List<Cards>();
  [NotNull] public IEnumerable<Card> Cards { get; private set; }

  public void AddCard([NotNull] Card card) { cards.Add(card); }
  ...
}

public static IEnumerable<int> CardValuesOfColor(this Deck deck, Color color)
{
  var cards = deck.Cards;
  return cards.Where(c => c.Color == color).Select(c => c.Value);
}

При запуске ReSharper Code Inspection он справедливо жалуется на возможное исключение System.NullReferenceException в "deck.Cards", поскольку в этом коде deck может быть нулевым. Это хорошо, я хочу сохранить это.

Тем не менее, он также будет жаловаться на c.Color и c.Value, так как в этих случаях он может быть равен нулю. Это кажется чрезмерным и менее чем полезным.

Я могу «исправить» c.Color, изменив лямбду с «c.Color == color» на «c! = Null && c.Color == color», хотя это мучительно для каждого предложения Where, особенно когда я знаю по дизайну класса, что колода. Карты не будут иметь нулевые значения.

Это не устраняет проблему c.Value, хотя ясно, что после измененного предложения "where" c не может быть нулевым.

Кажется, что нет способа написать предложение Select (...), OrderBy (...) и т. Д., Не вызывая это предупреждение.

Когда я включаю поиск возможных нулевых ссылок в моем проекте, я получаю сотни файлов с «проблемами». Мы широко используем LINQ, и поэтому многие, но не все, эти «проблемы» являются ложными, но их невозможно отключить.

Похоже, я выбираю отключить возможную проверку нулевых ссылок или аннотировать каждое отдельное использование расширения LINQ Select () комментарием. Ни один из которых действительно не работает для меня.

Существует ли третий вариант решения этой проблемы?

1 Ответ

0 голосов
/ 19 октября 2011

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

Проблема со статическим анализом заключается в том, что он не имеет представления о намерениях вашего кода, и поэтому вам гарантировано, что иногда он будетпредложить «улучшения», которые на самом деле ухудшают ваш код, поскольку в нем отсутствует контекст того, что соответствует значению, которое ваш код пытается выразить.

Это тот же аргумент, что и «для каждого правила естьисключение ", и люди, которые используют такие инструменты, как ReSharper (как и я), не должны слепо следовать этим советам.

На заметку по теме: контракты с кодом помогут вам решить проблему

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...