2016-06-30 1 views
10

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?

+0

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

+0

@ Glubus Pourrait-il être autre chose qu'un lambda pour commencer? –

+0

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

Répondre

3

Func<int, string> est un délégué qui pourrait être l'adresse d'une fonction ou en ligne en tant qu'expression lambda [() => x].

Expression<TDelegate> hérite de LambdaExpression et la NodeType d'un Expression<TDelegate> est toujours ExpressionType.Lambda.

Donc, je pense que ce genre de code de défense n'est pas nécessaire.

+0

Ouais c'est ce que je pensais. Je ne vois pas comment cela peut être autre chose dans ce cas. –