2

匿名メソッドの使用方法の例を教えてもらえますか?

それらを使用することによるパフォーマンスの低下のような欠点はありますか?

4

3 に答える 3

3

グローバル変数を回避するために匿名メソッドを使用すると非常に便利だと思います

匿名メソッドなし:

private static Dictionary<Binding, ErrorProvider> dict = 
    new  Dictionary<Binding, ErrorProvider>();

public static void ParseBinding(Binding binding)
{

     var errorProvider = new ErrorProvider();

     dict.Add(binding, errorProvider);

     binding.Parse += new ConvertEventHandler(binding_Parse);

}

static void binding_Parse(object sender, ConvertEventArgs e)
{
     var binding = sender as Binding;
     var errorProvider = dict[binding];

     try
     {
          // some validation form e.Value
          // throws exception if not valid
     }
     catch (Exception ex)
     {
         errorProvider.SetError(binding.Control, ex.Message);
     }
}

使用されなくなった場合はディクショナリからエントリを削除するように注意する必要があるため、これは非常に危険です。そうしないと、ガベージコレクタがバインディングまたはエラープロバイダを破棄しないため、メモリリークが発生します。

これで、匿名メソッドを使用したはるかに単純な実装:

public static void ParseBinding(Binding binding)
{
    var errorProvider = new ErrorProvider();

    binding.Parse += (sender, e) => 
        {
           try
           {
                // some validation form e.Value
                // throws exception if not valid
           }
           catch (Exception ex)
           {
               errorProvider.SetError(binding.Control, ex.Message);
           }
        };
}
于 2012-12-28T07:27:35.030 に答える
2

MSDNを読む:匿名メソッド(C#プログラミングガイド)

匿名メソッドの作成は、基本的に、コードブロックをデリゲートパラメーターとして渡す方法です。

匿名メソッドを使用すると、別のメソッドを作成する必要がなくなるため、デリゲートをインスタンス化する際のコーディングオーバーヘッドが削減されます。

たとえば、デリゲートの代わりにコードブロックを指定すると、メソッドを作成する必要があることが不要なオーバーヘッドのように見える場合に役立ちます。


ターゲットがブロックの外側にある匿名メソッドブロック内に、goto、break、continueなどのジャンプステートメントがあるとエラーになります。ターゲットがブロック内にある匿名メソッドブロックの外に、goto、break、continueなどのジャンプステートメントがあることもエラーです。

匿名メソッドは、外部スコープのrefまたはoutパラメーターにアクセスできません。

安全でないコードにanonymous-method-block内でアクセスすることはできません。

匿名メソッド、イテレータ、および部分クラスを使用したエレガントなコードの作成も参照してください。

匿名メソッドはインラインで定義され、クラスのメンバーメソッドとしては定義されません。さらに、メソッド属性を匿名メソッドに適用する方法はありません。また、匿名メソッドでジェネリック型を定義したり、ジェネリック制約を追加したりすることもできません。

于 2012-12-28T06:41:45.563 に答える
1

役に立つかもしれません...

http://www.dotnet-tricks.com/Tutorial/csharp/40ID180612-C-Sharp-Anonymous-Method.html

匿名メソッドを使用している場合、いくつかの欠点があります。まず、VisualStudioデバッガーの[編集して続行]機能を使用できないことです。コードのステップ実行中にメソッドまたは匿名メソッドを変更することは許可されていません。代わりに、コードを変更してデバッガーを再起動する必要があります。

もう1つの潜在的な問題は、匿名メソッドのコードを複数のイベントに応答して実行する必要があると仮定すると、一部の開発者は、アプリケーションのいくつかの場所にコードをコピーして貼り付け、コードの再利用の一般的なルールを無視する可能性があることです。使用する。

于 2012-12-28T06:58:28.440 に答える