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