2

私はデリゲートの進行状況フォームを持っています:

    // in ProgressForm thread
    public delegate void executeMethod(object parameters);      
    private executeMethod method;
    public object parameters;
    // ...
    private void ProgressForm_Shown(object sender, EventArgs e)
    {
         method.Invoke(parameters);
    }

どちらの方法を適用するのが良いか (より効率的か安全か) - 匿名デリゲートは次のように呼び出します。

// in other thread
ProgressForm progress = new ProgressForm();
progress.ExecuteMethod = delegate
{
   // to do
}

または、次のような別の方法を使用します。

// in other thread
private void myMethod(object par)
{
     // to do
}

progress.ExecuteMethod = this.myMethod;
4

2 に答える 2

6

最終的に、それらは驚くほど似ています。簡単に言うと、匿名の場合、コンパイラは隠しメソッドを内部的に作成します。特定のパフォーマンスの違いはありませんが、静的メソッドを作成することを選択する場合がありますが (thisまたはキャプチャされた変数を使用しない場合)、わずかに役立つ場合があります(ただし、興奮するほどではありません)。

次の場合に匿名メソッドを使用します。

  • これは短く、匿名メソッドを開始するコードに論理的に関連してます
  • おそらく、渡すのが難しい追加のコンテキスト(キャプチャされた変数)を使用しますmyMethod

主に注意すべき点は、悪名高いforeach(通常は) キャプチャされた変数の問題ですが、場合によっては、参照を無名メソッドにブリードして、大きなオブジェクトの寿命を予想外に延ばすこともできます。

より長い作業には、アプローチを使用しmyMethodます。

于 2010-10-27T07:28:32.017 に答える
2

性能は同じです。匿名デリゲートは、コンパイラによって他のメソッドと同様に通常のメソッドに変換されます。コードを ILDSM すると、匿名メソッドに対して実際の (ただし非表示の) 名前が生成されることがわかります。

于 2010-10-27T07:30:29.840 に答える