我通常会像这样进行警卫检查:
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:是否存在性能损失 - 即它是否需要比常规类型/边界/空检查更长的时间?
答案 0 :(得分:3)
Func<int, string>
是一个委托,可以是函数的地址,也可以作为lambda表达式内联[() => x
]。
Expression<TDelegate>
继承自LambdaExpression,而NodeType
的{{1}}始终为Expression<TDelegate>
所以,我认为不需要这种防御性代码。