Я обычно выполняю проверку защиты следующим образом:
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: Существует ли ограничение производительности - то есть занимает ли он больше времени, чем обычная проверка типа/границ/нулей?