ReSharper如何知道这种返回类型永远不会为空?

时间:2010-07-13 13:47:58

标签: c# .net resharper static-analysis

我正在使用ReSharper 5.0,并且想知道它的代码分析功能如何通过注释“Expression is always false”来强调以下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()永远不会返回null。但我认为没有。

那么 - 它怎么知道这个?我是否遗漏了一些明显的东西,或者ReSharper是否拥有一些特权知识,例如关于框架方法的内部元数据列表?或者它实际上“内省”内部代码并解决它?

2 个答案:

答案 0 :(得分:25)

ReSharper开发人员对.NET框架二进制文件运行流分析,并确定哪些方法可能返回null,也可能不返回DirectoryInfo.GetFiles。显然null永远不会返回JetBrains.

您可以使用一组{{1}}属性来注释您自己的代码以指示相同的规则集。看看ReSharper网站:http://www.jetbrains.com/resharper/features/code_analysis.html#Annotated_Framework

编辑:专门回答您的问题,“ReSharper是否拥有一些特权知识,例如关于框架方法的元数据的内部列表” - 是的,它来自“反省内部代码和工作”它出来了“

答案 1 :(得分:5)

Tim指出,我们对.NET Framework进行了注释。它与Code Contracts的相似,但有点不同。如果您在ReSharper安装中查看bin文件夹下,您可以看到所有注释。