デリゲートとイベントは、特にフォーム プログラミングを行う場合に、デリゲートとイベントを通じて処理および配信する必要がある場合によく使用されます。ここでは、コードを書くときにより明確に理解できるように、デリゲートとイベントの使用法とその理由について詳しく説明します。
委任の使用
イベントはメカニズムであり、イベントは委任によって実装されるため、委任を理解すると、イベントについてより深く理解できるようになります。以下に小さな例を見てみましょう。
これは、さまざまな言語でプログラマーを記述するためのコードです:
たとえば、次のように C# を使用してプログラマーを記述します。ここで、programerName パラメーターはプログラマーの名前を表します。
public void CsharpProgramer(string programerName) { Console.WriteLine(string.Format("{0} 使用C#编程!", programerName)); }
Java を使用してください、
public void JavaProgramer(string programerName) { Console.WriteLine(string.Format("{0} 使用Java语言编程!")); }
これほど多くの言語があるのに、どのプログラマーかをどうやって見分けることができるでしょうか?
public enum ProgramLanguage { CSharp, C, Java }
を表す列挙型を使用します。次に完全な説明を入力します。コードは次のとおりです:
public class ProgramerDescription { //01 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语言编程!")); } //02 public void Description(string programerName, ProgramLanguage type) { switch (type) { case ProgramLanguage.CSharp: CsharpProgramer(programerName); break; case ProgramLanguage.C: CProgramer(programerName); break; case ProgramLanguage.Java: JavaProgramer(programerName); break; default: Console.WriteLine("A kind of new Language that you never heard of."); break; } } } public enum ProgramLanguage { CSharp, C, Java }
呼び出し:
ProgramerDescription pm = new ProgramerDescription(); pm.Description("杨友山", ProgramLanguage.CSharp);
この時点で、「Yang Youshan は C# を使用してプログラムしています!」を出力します。
このように、プログラマ向けの予備プログラムが完成 記述を簡単に実装。ここの description メソッドでは、列挙型を使用してさまざまな言語を区別します。このように、プログラミング言語(C++、PHPなど)が多いため、言語を追加したい場合は、対応するメソッドを追加し、その後にメソッドを修正する必要があるため、メンテナンス性は比較的悪いです。 ProgramLanguage 列挙型。メソッドの追加は部分クラスを使用して実装できるため、元のプログラムにはほとんど影響しませんが、列挙型を変更することは、オブジェクト指向設計のオープンおよびクローズの原則に沿ったものではありません。
それでは、Description メソッドでこれを処理する方法、つまり列挙なしで、プログラマを記述するためにどのメソッド (CsharpProgramer、CProgramer、JavaProgramer) を呼び出すかを、Description メソッドはどのように区別するのでしょうか。
public void description(stringprogramerName, 特定の型の特定のパラメータ)
{
//対応するメソッドを呼び出す
}
ここでの特定の型は、どのメソッドの型を区別するために使用されます。ここでは呼び出したいメソッドをパラメータとして直接渡します。たとえば、C プログラマーを記述するために cprogramer メソッドを呼び出したいとします。
ProgramerDescript PM = New ProgramRdescript ();
PM.Descript ("D.M.RITCHIE", CPROGRAMER); このアイデアによれば、 Public String description (String) ProgramernErname、特定の型パラメータの「特定の型の特定のパラメータ」をどのように表現するか?
もちろん、C# のデリゲートについて考えます。デリゲートは、静的メソッドを参照するか、クラス インスタンスとそのクラスのインスタンス メソッドを参照するデータ構造です。 デリゲートを使用して上記のコードを完成させます:
public class ProgramDescriptionDelegate { //委托,表示方法 public delegate void DescriptionDelegate(string programerName); //01 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语言编程!")); } //02 public void Description(string programerName, DescriptionDelegate description) { description(programerName); } }Call:
ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate(); pm.Description("杨友山", pm.CsharpProgramer);結果は元のコードと同じです。
委任とは何ですか? MSDN では次のように説明されています。デリゲートはメソッド シグネチャを定義する型であり、互換性のあるシグネチャを持つ任意のメソッドに関連付けることができ、デリゲートを通じて呼び出すことができます。デリゲートは、メソッドをパラメータとして他のメソッドに渡すために使用されます。タイム ハンドラーは、デリゲートを通じて呼び出されるメソッドです。
public void description(string projecterName, descriptionDelegate description) を使用しているコードを注意深く見てください。呼び出すと、
DescriptionDelegate の説明が pm.CsharpProgramer に渡されます。つまり、この時点では description=pm.CsharpProgramer になります。実際、次のように呼び出すこともできます:
//方法和委托绑定 ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate(); YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate csharpDelegate = pm.CsharpProgramer; YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate cdelegate = pm.CProgramer; pm.Description("杨友山", csharpDelegate); pm.Description("D.M.Ritchie", cdelegate);結果: 再度変更:
ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate(); YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate pdelegate = null; pdelegate += pm.CsharpProgramer; pdelegate += pm.CProgramer; pm.Description("杨友山", pdelegate);結果: ここでは、最初に pm.CsharpProgramer が実行され、次に pm.CProgramer メソッドが実行されます。が実行されます。
デリゲートはメソッドをパラメーターとして使用できるだけでなく、メソッドをバインドすることもでき、複数のメソッドをバインドできることがわかります。
メソッドをバインドするには += を使用し、キャンセルするには -= を使用します。
ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate(); YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate pdelegate = null; pdelegate += pm.CsharpProgramer; pdelegate += pm.CProgramer; pdelegate -= pm.CProgramer; pm.Description("杨友山", pdelegate);この方法では、pm.CsharpProgramer メソッドが 1 つだけ呼び出されます。 上記は C# 基礎知識編 基礎知識 (20) コミッション (1) の内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。