【发布时间】:2016-11-02 00:35:50
【问题描述】:
我通常像这样执行警卫检查:
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:是否存在性能损失 - 即它是否需要比常规类型/边界/空检查更长的时间?
【问题讨论】:
-
如果你想要确保你的表达式是某种类型,而不是仅仅检查它,那么 Q1 似乎对你有好处。
-
@Glubus 除了 lambda 之外,它可以是其他任何东西吗?
-
是的。表达式用于描述和使用它所持有的数据的元数据。
Expression<<Func<int, string>>描述了一个接受整数并返回字符串的委托,但实际上并未定义此委托的实例。这样,您可以通过将它们链接在一起来创建整个表达式树。查看有关 Expression 类的 mdsn 文章。 -
@Glubus 你怎么看 jlvaquero 的回答
-
正确,因为你的参数类型是
Expression<Func<int, string>>,pred永远是Expression.Lambda。我可能把这弄糊涂了,因为我想了一会儿你在谈论一般的Expression类。
标签: c# validation lambda guard-clause