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