2016-06-30 11 views
10

のチェック、私は通常、そうのようなチェックガードを実行します。ガードはラムダ

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列挙型が持っています多くの可能性がありますが、私はコンパイラがラムダだけを許可すると仮定したため、どのように適用するのか理解できません。

Q1:これには利点がありますか?私たちはすべての入力のガードチェックを徹底しています。

Q2:パフォーマンスのペナルティはありますか?つまり、通常のタイプ/境界/ヌルチェックよりも時間がかかりますか?

+0

Q1は、あなたの式がヌルではなく、特定のタイプであることを確認したい場合に便利です。 – Glubus

+0

@Glubusしかし、それはラムダ以外で始めることができますか? –

+0

はい。式は、保持しているデータのメタデータを記述して使用するために使用されます。 'Expression << Func >'は、整数を受け取り、文字列を返すデリゲートを記述しますが、実際にはこのデリゲートのインスタンスを定義しません。この方法で、エクスプレッションツリーを連鎖させて全体を作成することができます。 Expressionクラスについてmdsn記事をチェックアウトしてください。 – Glubus

答えて

3

Func<int, string>は、ファンクションまたはインラインのラムダ式のアドレス[() => x]であるデリゲートです。

Expression<TDelegate> LambdaExpressionから継承し、Expression<TDelegate>NodeTypeは、だから、私は守備のコードのようなものが必要とされていないと思う常にExpressionType.Lambda.

です。

+0

それは私の考えだった。私はこの場合、どのように他のものになることができないのか分かりません。 –