我试着围绕表达身体成员特征的概念.
我在互联网上找到的基本示例非常清楚,但我遇到了这段特定的代码,我不知道它究竟意味着什么:
Assert.Throws<DivideByZeroException>(() => calculator.Divide(5, 0));
Run Code Online (Sandbox Code Playgroud)
上面的例子来自一本关于TDD技术的书,这就是你可以看到Assert类的原因.应该抛出Divide方法DivideByZeroException,现在我们正在测试它.
令人费解的部分是() => calculator.Divide(5, 0).
有人能解释那里究竟发生了什么吗?Divide函数的结果将体现为空括号?
这本身并不是表达身体的成员.这是一个lambda表达式.Lambda被添加到C#3; 表达体成员特征在很晚之后添加,其设计看起来像lambda语法.
你可以想到
Assert.Throws<DivideByZeroException>(() => calculator.Divide(5, 0));
Run Code Online (Sandbox Code Playgroud)
就像
class Whatever
{
static double SomeFunction() => calculator.Divide(5, 0);
...
... later
Func<double> f = SomeFunction;
Assert.Throws<DivideByZeroException>(f);
Run Code Online (Sandbox Code Playgroud)
这会让它更清楚吗?
简而言之:Assert.Throws接受一个函数,它调用函数,并验证函数是否抛出异常.它需要一个可以调用的函数是至关重要的.你不能只说
Assert.Throws<Whatever>(calculator.Divide(5, 0))
Run Code Online (Sandbox Code Playgroud)
因为那之前 Throws的召唤被召唤!