lambda 的保护检查
Guard checking of lambdas
我通常会这样进行保护检查:
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:这样做有好处吗?我们对所有输入进行了彻底的保护检查,这是否增加了价值?
问题 2:是否存在性能损失 - 即是否比常规 type/bounds/null 检查花费的时间更长?
Func<int, string>
是一个委托,它可以是函数的地址或内联为 lambda 表达式 [ () => x
] .
Expression<TDelegate>
继承自 LambdaExpression 并且 Expression<TDelegate>
的 NodeType
总是 ExpressionType.Lambda.
所以,我认为不需要那种防御性代码。
我通常会这样进行保护检查:
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:这样做有好处吗?我们对所有输入进行了彻底的保护检查,这是否增加了价值?
问题 2:是否存在性能损失 - 即是否比常规 type/bounds/null 检查花费的时间更长?
Func<int, string>
是一个委托,它可以是函数的地址或内联为 lambda 表达式 [ () => x
] .
Expression<TDelegate>
继承自 LambdaExpression 并且 Expression<TDelegate>
的 NodeType
总是 ExpressionType.Lambda.
所以,我认为不需要那种防御性代码。