1

Stackoverflowから、アプリケーションからマジックストリングを削除するための便利なコードをいくつかピックアップしました。コードは次のようになります。

protected void OnPropertyChanged<T>(Expression<Func<T>> selectorExpression) { }

メソッドは次のように呼び出されます。

this.OnPropertyChanged( () => DisplayName);

DisplayName(クラスのプロパティはどこにありますか。)

この形式のメソッドを使用することは非常に便利ですが(リファクタリングが簡単な方法が好きです)、何が行われているのかよくわかりません。

どこにT割り当てられ、どのような価値がありますか?インテリセンスは、クラスが持つプロパティをどのように取得しますか(Tメソッドが呼び出されるコンテキストから暗黙的に設定されますか?)

式は() => DisplayNameコンパイル時に固定されますか、それともメソッドが呼び出されるたびに計算されますか?関連:マジックストリングの使用はより効率的ですか?

4

2 に答える 2

1

この質問を確認してください:ラムダ式からプロパティ名を取得しています。これは、実行時に分析できる式のおかげで可能であり、そこからプロパティ名を取得することができます。

この質問も読む必要があります:Expression<Func<>>とFunc<>の違い

要するに、式は実行可能であるだけでなく、実行時に式ツリーとして分析できるコードであるということです。

于 2012-04-30T09:59:05.290 に答える
1

Expressionクラスは通常、実行時に変更できる動的コードを作成するために使用されます。Tは、ラムダによって返される型です。どのタイプでもかまいません。

MSDNから:式ツリーは、ツリーのようなデータ構造のコードを表します。各ノードは式であり、たとえば、メソッド呼び出しやx<yなどの二項演算です。 http://msdn.microsoft.com/en-us/library/bb397951.aspx

その後、式ツリーを実行時にコンパイルまたは分析できます。

Expression<Func<T>> selectorExpression

型Tを返す引数のない関数である式の型です。

実行時にselectorExpressionをコンパイルして実行できます。

OnPropertyChangedメソッドの場合selectorExpressionはコンパイルおよび実行されず、プロパティ名を取得するために分析されるだけです。この投稿では、その仕組みについて少し詳しく説明します。ラムダ式からプロパティ名を取得する

私の意見では、OnPropertyChangedハンドラーでは無視できますが、これを行うとパフォーマンスのオーバーヘッドが発生します。簡単なリファクタリングの利点は、パフォーマンスコストを大幅に上回ります。

于 2012-04-30T10:11:25.210 に答える