C〓〓匿名方法解説


匿名の方法はC_am 2.0が導入した新しい特性です.開発者はオンラインで自分の関数コードを宣言することができます.委託関数を使用する必要はありません.匿名の方法は通常1.一時的な方法が必要です.この方法の使用回数は極めて少ないです.2.この方法のコードは短いです.方法声明よりも短い場合もあります.
 
C铉1.1において、声明と使用依頼は、依頼がトリガされた時に署名に一致する実行可能な方法と、命名方法と委託に関連する割当文とがあります.C〓2.0の新しい特性として、匿名方法は基本的に前の命名方法と同じ機能を提供することができますが、もう一つの依頼に関連するものは必要ありません.前に作成方法を明確にしました.C〓匿名方法は委託に関連する便利な方法として想像できます.同時に匿名方法の実現と命名方法を見て、取得したILの結果を実現すれば、両者の違いは非常に小さいです.コンパイラが匿名方法に触れると、クラスの中に命名者を作成します.したがって、匿名の方法は、実行中にネーミング方法の性能と非常に類似しています.性能の増加は、実行中の実行ではなく、開発者の生産効率に反映されます.
 
2.0の前のC〓〓バージョンでは、声明依頼の唯一の方法はネーミング方法を使用することである.C〓2.0は匿名方法を導入した.コードブロックを委託パラメータに渡すには、匿名方法を作成するのが唯一の方法である.
// Create a handler for a click event
button1.Click += delegate(System.Object o, System.EventArgs e)
                   { System.Windows.Forms.MessageBox.Show("http://www.my400800.cn"); };
 または
// Create a delegate instance
delegate void Del(int x);

// Instantiate the delegate using an anonymous method
Del d = delegate(int k) { /* ... */ };

 
 
匿名の方法を使用すると、個別の方法を作成する必要はなく、したがって、実用化依頼に必要な符号化システムオーバーヘッドが低減される.
例えば、作成方法に必要なシステムオーバーヘッドが不要であれば、委託先の位置にコードブロックを指定することが非常に有用である.新しいスレッドを起動することは良い例である.より多くの方法を作成することを依頼する必要がなく、スレッドクラスはスレッドを作成し、スレッド実行のコードを含むことができる.
 
void StartThread()
{
    System.Threading.Thread t1 = new System.Threading.Thread
      (delegate()
            {
                System.Console.Write("Hello, ");
                System.Console.WriteLine("http://www.my400800.cn");
            });
    t1.Start();
}
 
 
 
コメント
匿名法のパラメータの範囲はanonymous-method-blockです.
ブロック外の匿名方法ブロック内でジャンプ文(goto、breakまたはcontinue)を使用するのはエラーです.ブロック内の匿名方法ブロックの外部にジャンプ文(goto、breakまたはcontine ueなど)を使用するのも間違っています.
ローカル変数およびパラメータの範囲が匿名の方法宣言を含む場合、このローカル変数およびパラメータは、匿名の方法の外部変数または獲得変数と呼ばれる.例えば、以下のコードセグメントのnは外部変数である.
 
int n = 0;
Del d = delegate() { System.Console.WriteLine("Copy #:{0}", ++n); };
 
外部変数のライフサイクルは、ローカル変数とは異なり、この匿名方法を引用する依頼がゴミ回収の条件に合致するまで継続されています.nへの参照は、この依頼を作成する際に取り込まれたものです.
匿名の方法は外部範囲のrefまたはoutパラメータにアクセスできません.
anonymous-method-blockでは安全でないコードにアクセスできません.

以下の例では、実例化依頼の2つの方法を示します.
  • は、匿名の方法に委託を関連付ける.
  • 委託をネーミング方法(DoWork)に関連付ける.
  • 二つの方法はいずれも依頼を呼び出した時にメッセージを表示します.
    // Declare a delegate
    delegate void Printer(string s);
    
    class TestClass
    {
        static void Main()
        {
            // Instatiate the delegate type using an anonymous method:
            Printer p = delegate(string j)
            {
                System.Console.WriteLine(j);
            };
    
            // Results from the anonymous delegate call:
            p("The delegate using the anonymous method is called.");
    
            // The delegate instantiation using a named method "DoWork":
            p = new Printer(TestClass.DoWork);
    
            // Results from the old style delegate call:
            p("The delegate using the named method is called.");
           //  p("    :http://www.my400800.cn   400       .");    }
    
        // The method associated with the named delegate:
        static void DoWork(string k)
        {
            System.Console.WriteLine(k);
        }
    }
    
     
    出力:
    The delegate using the anonymous method is caled.
    The delegate using the named method is caled.
    いらっしゃいませ.http://www.my400800.cn.   400電話はウェブサイトを取り扱います.