【问题标题】:Guard checking of lambdas保护检查 lambda
【发布时间】: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&lt;&lt;Func&lt;int, string&gt;&gt; 描述了一个接受整数并返回字符串的委托,但实际上并未定义此委托的实例。这样,您可以通过将它们链接在一起来创建整个表达式树。查看有关 Expression 类的 mdsn 文章。
  • @Glubus 你怎么看 jlvaquero 的回答
  • 正确,因为你的参数类型是Expression&lt;Func&lt;int, string&gt;&gt;pred 永远是Expression.Lambda。我可能把这弄糊涂了,因为我想了一会儿你在谈论一般的 Expression 类。

标签: c# validation lambda guard-clause


【解决方案1】:

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

Expression&lt;TDelegate&gt; 继承自 LambdaExpression,Expression&lt;TDelegate&gt;NodeType 始终为 ExpressionType.Lambda.

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

【讨论】:

  • 是的,这就是我的想法。在这种情况下,我看不出它怎么可能是其他任何东西。
猜你喜欢
  • 2015-07-16
  • 2013-12-10
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-18
  • 2017-11-29
相关资源
最近更新 更多