のチェック、私は通常、そうのようなチェックガードを実行します。ガードはラムダ
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:パフォーマンスのペナルティはありますか?つまり、通常のタイプ/境界/ヌルチェックよりも時間がかかりますか?
Q1は、あなたの式がヌルではなく、特定のタイプであることを確認したい場合に便利です。 – Glubus
@Glubusしかし、それはラムダ以外で始めることができますか? –
はい。式は、保持しているデータのメタデータを記述して使用するために使用されます。 'Expression << Func>'は、整数を受け取り、文字列を返すデリゲートを記述しますが、実際にはこのデリゲートのインスタンスを定義しません。この方法で、エクスプレッションツリーを連鎖させて全体を作成することができます。 Expressionクラスについてmdsn記事をチェックアウトしてください。 –
Glubus