什么是守卫方法/类?

时间:2009-10-20 23:45:59

标签: .net class methods guard

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

任何解释和/或样品将不胜感激。 (特别是来自.Net方面。)

3 个答案:

答案 0 :(得分:1)

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

据我所知的.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

可能不是很明显,你可以在警卫中提供一个表达,在发送过程中进行评估。非常整洁,嘿?

答案 1 :(得分:1)

如果您没有指定例外,那么.NET将抛出RaiseContractFailedEvent,但您可以指定ArgumentOutOfRangeExceptionArgumentNullException

如果你看一下Jon Skeet的链接,在文档pdf中你会看到很多例子,一个是:

Contract.Requires( x ! = null );

这是合同设计的一部分,您可以在其中指定前提条件和后置条件。优点是在使用输入参数之前不必进行大量验证,并且它有助于调用函数知道结果将根据契约,因此,如果不允许字符串返回如果是null,那么在调用函数时,由于前置条件检查,您不必测试null。

答案 2 :(得分:0)

这是典型的保护条款用例的简要概述:

Refactoring guard clauses, or “How to ask politely”