代码在处理文件时收缩使用模式

时间:2010-07-05 11:27:25

标签: c# code-contracts

我刚开始使用.NET代码合同,我有一个像这样的保护条款

if (!file.Exists(path)) throw FileNotFoundException();

并将其替换为

Contract.Requires(File.Exists(path));

我不确定这是否正确,因为合同将处理I / O问题,但不确定这是否是一个问题。

基本上问题是:使用合同确保I / O问题(或外部/非单元问题)是否有任何问题?

2 个答案:

答案 0 :(得分:6)

文件是否存在通常是一个先决条件,你使用Contract.Requires()。启用合同验证是可选的,通常不会在发布版本中打开。这使你的测试消失了。

坦率地说,你不应该写这样的代码。任何使用该文件的尝试都会产生异常,它将比您的版本提供更多信息。它包含无法找到的文件的名称。更重要的是,File.Exists()在多任务操作系统上是不可靠的。可以在Exists()调用之后立即抢占该线程,而另一个进程中的另一个线程可以删除该文件。并且你手上会有一个heisenbug:你会得到一个FileNotFound异常,即使你测试过它也存在。

我的电话:只是删除声明。它导致的问题多于解决的问题。

答案 1 :(得分:3)

  • 如果您不确定该文件是否存在,请不要使用例外。
  • 如果文件存在,但在某些特殊情况下可能不存在,请使用例外。
  • 如果您确定该文件不存在是编程错误,请使用Contract.Ensures。