我正在使用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是否拥有一些特权知识,例如关于框架方法的内部元数据列表?或者它实际上“内省”内部代码并解决它?
答案 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文件夹下,您可以看到所有注释。