Как ReSharper знает, что этот тип возврата никогда не является нулевым?
Я использую ReSharper 5.0, и мне интересно, как его функция анализа кода знает, чтобы высвечивать следующий assemblies == null
с комментарием "Expression всегда false".
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()
никогда не вернет значение null. но я не думаю, что есть.
Итак - как он это знает? Я упускаю что-то очевидное или у ReSharper есть некоторые привилегированные знания, такие как внутренний список метаданных о методах структуры? Или это действительно "заставляет" внутреннее кодирование и работать?
Ответы
Ответ 1
Разработчики ReSharper провели анализ потоков в двоичных файлах среды .NET и определили, какие методы могут возвращать или не возвращать null
. По-видимому, DirectoryInfo.GetFiles
никогда не возвращает null
.
Вы можете аннотировать свой собственный код, чтобы указать тот же набор правил, с набором атрибутов JetBrains.
. Взгляните на сайт ReSharper: http://www.jetbrains.com/resharper/features/code_analysis.html#Annotated_Framework
Изменить:, чтобы ответить на ваш вопрос конкретно: "У ReSharper есть некоторые привилегированные знания, такие как внутренний список метаданных о методах каркаса" - да, это произошло от "интроспекции внутреннего кода и работы это"
Ответ 2
Как указывает Tim, мы аннотируем .NET Framework. Это похоже на то, что вы получаете с Code Contracts, но сделано немного по-другому. Если вы посмотрите под папкой bin в установке ReSharper, вы можете увидеть все аннотации.