Охранная проверка лямбда
Я обычно выполняю проверку защиты следующим образом:
public void doStuff(Foo bar, Expression<Func<int, string>> pred) {
if (bar == null) throw new ArgumentNullException();
if (pred == null) throw new ArgumentNullException();
// etc...
}
Я видел эту дополнительную проверку, которая гарантирует, что предикат на самом деле лямбда:
if (pred.NodeType != ExpressionType.Lambda) throw new ArgumentException();
В перечислении ExpressionType
есть много возможностей, но я не понимаю, как кто-либо из них применится, потому что я предположил, что компилятор разрешит только lambda.
Q1: Есть ли преимущества для этого? Мы проводим тщательную проверку всех входов, так что это добавляет ценность?
Q2: Существует ли ограничение производительности - то есть занимает ли он больше времени, чем обычная проверка типа/границ/нулей?
Ответы
Ответ 1
Func<int, string>
является делегатом, который может быть адресом функции или встроенным в виде лямбда-выражения [ () => x
].
Expression<TDelegate>
наследуется от LambdaExpression, а NodeType
для Expression<TDelegate>
всегда ExpressionType.Lambda.
Итак, я думаю, что такой защитный код не нужен.