ホームページ バックエンド開発 C#.Net チュートリアル C#の基礎知識集 基礎知識(20) デリゲーション(1)

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

Feb 11, 2017 pm 01:59 PM

デリゲートとイベントは、特にフォーム プログラミングを行う場合に、デリゲートとイベントを通じて処理および配信する必要がある場合によく使用されます。ここでは、コードを書くときにより明確に理解できるように、デリゲートとイベントの使用法とその理由について詳しく説明します。
委任の使用
イベントはメカニズムであり、イベントは委任によって実装されるため、委任を理解すると、イベントについてより深く理解できるようになります。以下に小さな例を見てみましょう。
これは、さまざまな言語でプログラマーを記述するためのコードです:
たとえば、次のように 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) に注目してください。


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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C# を使用した Active Directory C# を使用した Active Directory Sep 03, 2024 pm 03:33 PM

C# を使用した Active Directory のガイド。ここでは、Active Directory の概要と、C# での動作方法について、構文と例とともに説明します。

C# シリアル化 C# シリアル化 Sep 03, 2024 pm 03:30 PM

C# シリアル化のガイド。ここでは、C# シリアル化オブジェクトの導入、手順、作業、例についてそれぞれ説明します。

C# の乱数ジェネレーター C# の乱数ジェネレーター Sep 03, 2024 pm 03:34 PM

C# の乱数ジェネレーターのガイド。ここでは、乱数ジェネレーターの仕組み、擬似乱数の概念、安全な数値について説明します。

C# データ グリッド ビュー C# データ グリッド ビュー Sep 03, 2024 pm 03:32 PM

C# データ グリッド ビューのガイド。ここでは、SQL データベースまたは Excel ファイルからデータ グリッド ビューをロードおよびエクスポートする方法の例について説明します。

C# のパターン C# のパターン Sep 03, 2024 pm 03:33 PM

C# のパターンのガイド。ここでは、C# のパターンの概要と上位 3 種類について、その例とコード実装とともに説明します。

C# の階乗 C# の階乗 Sep 03, 2024 pm 03:34 PM

C# の Factorial のガイド。ここでは、C# での階乗の概要について、さまざまな例とコード実装とともに説明します。

C# の素数 C# の素数 Sep 03, 2024 pm 03:35 PM

C# の素数ガイド。ここでは、C# における素数の導入と例を、コードの実装とともに説明します。

マルチスレッドと非同期C#の違い マルチスレッドと非同期C#の違い Apr 03, 2025 pm 02:57 PM

マルチスレッドと非同期の違いは、マルチスレッドが複数のスレッドを同時に実行し、現在のスレッドをブロックせずに非同期に操作を実行することです。マルチスレッドは計算集約型タスクに使用されますが、非同期はユーザーインタラクションに使用されます。マルチスレッドの利点は、コンピューティングのパフォーマンスを改善することですが、非同期の利点はUIスレッドをブロックしないことです。マルチスレッドまたは非同期を選択することは、タスクの性質に依存します。計算集約型タスクマルチスレッド、外部リソースと相互作用し、UIの応答性を非同期に使用する必要があるタスクを使用します。

See all articles