我创建了一些类库,其中一些被世界各地的其他人使用,现在我开始使用 Visual Studio 2010 我想知道切换到使用代码合同而不是常规的旧 - 对我来说是多么好的主意风格的 if 语句。
IE。而不是这个:
if (fileName == null)
throw new ArgumentNullException("fileName");
用这个:
Contract.Requires(fileName != null);
我问的原因是我知道静态检查器对我不可用,所以我对我做出的一些假设有点紧张,编译器无法验证。这可能会导致类库不为下载它的人编译,当他们有静态检查器时。再加上我什至无法重现该问题,修复起来会很烦人,而且我认为,如果它看起来甚至没有从盒子。
所以我有几个问题:
- 如果您有权访问静态检查器,它是否默认打开?或者是否有我需要在类库中打开的设置(因为我没有静态检查器,所以我不会)
- 我的担心是没有根据的吗?上述情况是一个真正的问题吗?
任何的建议都受欢迎。
编辑:让我澄清一下我的意思。
假设我在一个类中有以下方法:
public void LogToFile(string fileName, string message)
{
Contracts.Requires(fileName != null);
// log to the file here
}
然后我有这个代码:
public void Log(string message)
{
var targetProvider = IoC.Resolve<IFileLogTargetProvider>();
var fileName = targetProvider.GetTargetFileName();
LogToFile(fileName, message);
}
现在,在这里,IoC 开始了,解决了一些“随机”类,为我提供了一个文件名。假设对于这个库,我不可能取回一个不会给我一个非空文件名的类,但是,由于 IoC 调用的性质,静态分析无法验证这一点,因此可能假设一个可能的值可能为空。
LogToFile
因此,静态分析可能会得出结论,即存在使用参数调用方法的风险null
,因此无法构建。
我知道我可以在代码中添加假设,说编译器应该接受它,因为fileName
我从那个方法得到的永远不会为空,但是如果我没有静态分析器(VS2010 Professional),上面代码会为我编译,因此我可能会将它作为一个沉睡的错误留给拥有 Ultimate 的人来查找。换句话说,不会有编译时警告说明这里可能有问题,所以我可能会按原样发布库。
那么这是一个真实的场景和问题吗?