我刚开始使用.NET代码合同,我有一个像这样的保护条款
if (!file.Exists(path)) throw FileNotFoundException();
并将其替换为
Contract.Requires(File.Exists(path));
我不确定这是否正确,因为合同将处理I / O问题,但不确定这是否是一个问题。
基本上问题是:使用合同确保I / O问题(或外部/非单元问题)是否有任何问题?
答案 0 :(得分:6)
文件是否存在通常是一个先决条件,你使用Contract.Requires()。启用合同验证是可选的,通常不会在发布版本中打开。这使你的测试消失了。
坦率地说,你不应该写这样的代码。任何使用该文件的尝试都会产生异常,它将比您的版本提供更多信息。它包含无法找到的文件的名称。更重要的是,File.Exists()在多任务操作系统上是不可靠的。可以在Exists()调用之后立即抢占该线程,而另一个进程中的另一个线程可以删除该文件。并且你手上会有一个heisenbug:你会得到一个FileNotFound异常,即使你测试过它也存在。
我的电话:只是删除声明。它导致的问题多于解决的问题。
答案 1 :(得分:3)