Как ReSharper узнает, что этот тип возврата никогда не равен нулю? - PullRequest
16 голосов
/ 13 июля 2010

Я использую ReSharper 5.0, и мне интересно, как его функция анализа кода знает, чтобы выделить следующее assemblies == null с комментарием "Выражение всегда ложно".

var directory = new DirectoryInfo("somedir");
FileInfo[] assemblies = directory.GetFiles("*.dll");

if (assemblies == null <<--- this is highlighted with "Expression is always false"
    || assemblies.Length == 0)
{
  _log.Warn("No assemblies found");
}

Я бы понял, если бы тип возвращаемого значения был типом значения, а это не так. Я также понял бы, если бы был какой-то контракт кода или метаданные, указывающие, что .GetFiles() никогда не вернет ноль. но я не думаю, что есть.

Итак, откуда он это знает? Я что-то упускаю из виду или ReSharper обладает некоторыми привилегированными знаниями, такими как внутренний список метаданных о методах фреймворка? Или он на самом деле " introspect " внутренний код и работает?

Ответы [ 2 ]

25 голосов
/ 13 июля 2010

Разработчики ReSharper провели анализ потоков в двоичных файлах платформы .NET и определили, какие методы могут возвращать или не возвращать null. Видимо DirectoryInfo.GetFiles никогда не возвращается null.

Вы можете аннотировать свой собственный код для указания того же набора правил с набором атрибутов JetBrains.. Взгляните на сайт ReSharper: http://www.jetbrains.com/resharper/features/code_analysis.html#Annotated_Framework

Редактировать: чтобы конкретно ответить на ваш вопрос: «Имеет ли ReSharper какие-то привилегированные знания, такие как внутренний список метаданных о методах фреймворка» - да, это произошло из «внутреннего анализа внутреннего кода и его работы» из "

5 голосов
/ 14 июля 2010

Как указывает Тим, мы комментируем .NET Framework. Это похоже на то, что вы получаете с Code Contracts, но сделано немного по-другому. Если вы загляните в папку bin в установке ReSharper, вы увидите все аннотации.

...