ホームページ  >  記事  >  バックエンド開発  >  C#の基礎知識集 基礎知識(21) デリゲーション(2)

C#の基礎知識集 基礎知識(21) デリゲーション(2)

黄舟
黄舟オリジナル
2017-02-11 14:05:551290ブラウズ

前の記事のデリゲートの使用法に関する http://www.php.cn/ を見ると、

        public void Description(string programerName, DescriptionDelegate description)
        {
            description(programerName);
        }

このメソッドは descriptionDelegate 記述デリゲート タイプを渡すことがわかりました。そのため、このメソッドにいくつかの変更を加えると、より便利になり、コードもより合理的になります。デリゲートをカプセル化し、さまざまな言語でプログラマ記述メソッドを提示します。
カプセル化:

    public class ProgramDescriptionDelegate2
    {
        public delegate void DescriptionDelegate(string programerName);

        public DescriptionDelegate myDelegate;

        public void Description(string programerName)
        {
            myDelegate(programerName);
        }
    }

提案されたクラス:

    public class TestDescriptionDelegate2
    {
        public void CsharpProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0} 使用C#编程!", programerName));
        }

        public void CProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0}使用C语言编程!", programerName));
        }

        public void JavaProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0} 使用Java语言编程!", programerName));
        }

        public void Test()
        {
            ProgramDescriptionDelegate2 pe = new ProgramDescriptionDelegate2();

            pe.myDelegate = CsharpProgramer;

            pe.myDelegate += CProgramer;

            pe.Description("SamYang");
        }
    }

これは、public void CsharpProgramer(string projecterName) のメソッドがユーザーである必要があるため、より合理的です。いつでも定義でき、いつでも変化するとみなすことができます。 ProgramDescriptionDelegate2 は完全にパブリック クラスであり、デリゲートにバインドされたメソッドの実行のみを担当します。
呼び出し:

            TestDescriptionDelegate2 t = new TestDescriptionDelegate2();

            t.Test();

出力:

ProgramDescriptionDelegate2 クラスを見てください。オブジェクト指向のカプセル化に従って、フィールドはプロパティとしてカプセル化される必要があります。したがって、ここでは非常に便利なフィールド イベントを使用してカプセル化する必要があります。
カプセル化は次のとおりです:

   public class ProgramerDescriptionEvent
    {
        public delegate void DescriptionDelegate(string programerName);

        private event DescriptionDelegate myEvent;

        public event DescriptionDelegate MyEvent
        {
            add { this.myEvent += value; }

            remove { this.myEvent -= value; }
        }

        public void Description(string programerName)
        {
            myEvent(programerName);
        }
    }

  public class TestEvent
    {
        public void CsharpProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0} 使用C#编程!", programerName));
        }

        public void CProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0}使用C语言编程!", programerName));
        }

        public void JavaProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0} 使用Java语言编程!", programerName));
        }

        public void Test()
        {
            ProgramerDescriptionEvent pe = new ProgramerDescriptionEvent();

            pe.MyEvent += CsharpProgramer;

            pe.MyEvent += JavaProgramer;

            pe.Description("SamYang");//一般这个执行是放在引起事件执行的地方
        }
    }

呼び出し:

            TestEvent te = new TestEvent();

            te.Test();

結果は次のとおりです:

実際、本質は委任を使用することですが、イベントを使用することがわかります。この委任は、イベントと呼ばれるメカニズムになります。
次に、デリゲートとイベントに関する msdn の説明を見てください:
イベントは、操作の発生を通知するためにオブジェクトによって送信されるメッセージです。操作は、ユーザーの操作 (マウス、キーボード操作など) または他のプログラム ロジック トリガーによって引き起こされる場合があります。 。イベントを取得してそれに応答するオブジェクトは、イベント レシーバーと呼ばれます。
イベント通信では、イベント送信側クラスは、自分が発生させたイベントをどのオブジェクトまたはメソッドが受信するのかを知りません。必要なのは、発信者と受信者の間に仲介者の存在があることだけです。 .NET Framework は、関数ポインターの機能を提供する特別な型 (デリゲート) を定義します。デリゲートは、メソッドへの参照を保持するクラスです。他のクラスとは異なり、デリゲート クラスにはシグネチャがあり、そのシグネチャと一致するメソッドのみを参照できます。このように、デリゲートは型安全な関数ポインターまたはコールバックと同等です。デリゲートには他にも多くの用途がありますが、ここではデリゲートのイベント処理機能についてのみ説明します。デリゲート クラスを定義するには、デリゲート宣言で十分です。宣言はデリゲートの署名を提供し、共通言語ランタイムは実装を提供します。例:
public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
delegate キーワードは、AlarmEventHandler がデリゲート型であることをコンパイラに通知します。慣例により、.NET Framework のイベント デリゲートには、イベントを発生させたソースとイベントのデータという 2 つのパラメーターがあります。それが送信者とeです。

上記は、C# の基礎知識、基礎知識 (21)、コミッション (2) の内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。