2

我只是注意到这个问题中提到的警卫方法/类,我并没有真正从答案中得到这个概念。唉,Jon Skeet 指向 MS 网站的链接从未加载过。一些快速的谷歌搜索似乎只产生产品,而不是软件工程概念。

任何解释和/或样本将不胜感激。(尤其是 .Net 方面。)

4

3 回答 3

1

保护子句是面向方面编程的一部分,您可以在其中定义什么是方法的允许输入。

根据我对 .Net 实现的了解(我还没有真正研究过),您可以使用属性来执行此操作,例如

public static void NeverGetNull([ThisParamNotNull]MyClass i, [ThisParamNotNull]OtherClass j)
{
   // Will never need to check for null values on i or j!
}

我实际上知道 Erlang 中的保护表达式是什么,其中方法调度依赖于保护方法。我将在下面给出一些伪代码来说明这一点:

myMethod(input i) where i is an int
{
 return i + 10
}
myMethod(input i) where i is an int and i > 10
{
 return i - 10
}

var i = myMethod(1) // returns 11
var i = myMethod(i) // returns 1

可能不是很明显,您可以在派发期间评估的守卫中提供一个表达式。很整洁,嘿?

于 2009-10-21T00:04:56.353 回答
1

如果您不指定异常,则 .NET 将抛出RaiseContractFailedEvent,但您可以指定ArgumentOutOfRangeExceptionArgumentNullException

如果您查看 Jon Skeet 的链接,在文档 pdf 中您会看到许多示例,其中一个是:

Contract.Requires( x ! = null );

这是合同设计的一部分,您可以在其中指定前置条件和后置条件。好处是在使用入参之前不用做大量的验证,也有助于调用函数知道结果会符合约定,所以,如果不允许字符串返回如果为 null,则由于前提条件检查,您不必在调用函数时测试 null。

于 2009-10-21T01:29:02.317 回答
0
于 2009-10-20T23:50:02.800 回答