为什么我要使用代码契约,比如
Contract.Requires<ArgumentNullException>( x != null, "x" );而不是美好的旧
if (x!=null){}
else throw...除了简洁,还有其他好处吗?
发布于 2014-04-23 07:11:39
根据MSDN
代码合同的好处包括:
你的里程可能会不同,其中哪些点重要,哪些不重要。我发现第三和第四(静态验证和文档)特别有趣。
换句话说,它是更结构化的描述契约的方式(而不是像if (x!=null){}这样的构造),这是其他工具能够理解的。
发布于 2014-04-23 08:26:53
除了语法糖,代码契约是微软的“按合同设计”范式的工具。合同
在设计类和操作时,它基本上是一种不同的思维方式。从经验来看,DbC在测试驱动开发中工作得非常好,在编写任何业务逻辑之前,您基本上定义了契约并编写了测试。
在幕后,契约契约在编译时生成类似于好的旧代码的代码,因此IL代码包含所有检查。
例如,类
public class Scheduler
{
public bool ScheduleTask(string taskname, DateTime startTime, DateTime endTime)
{
Contract.Requires(!string.IsNullOrWhiteSpace(taskname));
Contract.Requires(startTime != null);
Contract.Requires(endTime != null);
return true;
}
}会导致这样的结果
public bool ScheduleTask(string taskname, DateTime startTime, DateTime endTime)
{
__ContractsRuntime.Requires(!string.IsNullOrWhiteSpace(taskname), null, "!string.IsNullOrWhiteSpace(taskname)");
__ContractsRuntime.Requires(true, null, "startTime != null");
__ContractsRuntime.Requires(true, null, "endTime != null");
return true;
}其中_ContractsRuntime.Requests看起来如下所示
internal static void Requires(bool condition, string msg, string conditionTxt)
{
if (!condition)
{
__ContractsRuntime.ReportFailure(ContractFailureKind.Precondition, msg, conditionTxt, null);
}
}https://stackoverflow.com/questions/23237267
复制相似问题