10

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

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

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

  if (pred.NodeType != ExpressionType.Lambda) throw new ArgumentException();

ExpressionType枚举有很多可能性,但我不明白它们中的任何一个将如何应用,因为我假设编译器只允许 lambda 。

Q1:这样做有好处吗?我们对所有输入进行彻底的警戒检查,这是否增加了价值?

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

4

1 回答 1

3

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

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

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

于 2016-06-30T09:11:16.710 回答