Je garde habituellement la vérification exécutée de façon:vérification des lambdas
public void doStuff(Foo bar, Expression<Func<int, string>> pred) {
if (bar == null) throw new ArgumentNullException();
if (pred == null) throw new ArgumentNullException();
// etc...
}
Je l'ai vu ce contrôle supplémentaire qui garantit que le prédicat est en fait un lambda:
if (pred.NodeType != ExpressionType.Lambda) throw new ArgumentException();
Le ExpressionType
ENUM beaucoup de possibilités, mais je ne comprends pas comment l'un d'entre eux s'appliquerait car je supposais que le compilateur ne permettrait qu'un lambda.
Q1: Y at-il un avantage à cela? Nous effectuons une vérification approfondie de toutes les entrées, est-ce que cela ajoute de la valeur?
Q2: Y a-t-il une pénalité de performance, c'est-à-dire prend-elle plus de temps qu'un contrôle type/bounds/null?
Semble que Q1 vous profite si vous * voulez * vous assurer que votre expression est d'un certain type, plutôt que juste la vérification nulle. – Glubus
@ Glubus Pourrait-il être autre chose qu'un lambda pour commencer? –
Oui. Les expressions sont utilisées pour décrire et utiliser les métadonnées des données qu'il contient. 'Expression << Func>' décrit un délégué qui accepte un entier et renvoie une chaîne, mais ne définit pas réellement une instance de ce délégué. De cette façon, vous pouvez créer des arbres d'expression entiers en les chaînant ensemble. Passez en revue l'article de mdsn au sujet de la classe d'expression. –
Glubus