警卫检查lambda

h b*_*bob 10 c# validation lambda guard-clause

我通常会像这样执行警卫检查:

public void doStuff(Foo bar, Expression<Func<int, string>> pred) {
  if (bar == null) throw new ArgumentNullException();
  if (pred == null) throw new ArgumentNullException();
  // etc...
}
Run Code Online (Sandbox Code Playgroud)

我已经看到这个额外的检查确保谓词实际上是一个lambda:

  if (pred.NodeType != ExpressionType.Lambda) throw new ArgumentException();
Run Code Online (Sandbox Code Playgroud)

该ExpressionType枚举有很多可能性,但我不知道如何任何人的规定将适用,因为我假定编译器将只允许一个lambda.

Q1:这有什么好处?我们对所有输入进行彻底的保护检查,这是否会增加价值?

Q2:是否存在性能损失 - 即它需要比常规类型/边界/空检查更长的时间吗?

jlv*_*ero 4

Func<int, string>是一个委托,可以是函数的地址或内联为 lambda 表达式 [ () => x] 。

Expression<TDelegate>继承自 LambdaExpression 并且NodeTypeanExpression<TDelegate>始终是ExpressionType.Lambda.

所以,我认为不需要那种防御性代码。