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

デリゲートとイベントは、特にフォーム プログラミングを行う場合に、デリゲートとイベントを通じて処理および配信する必要がある場合によく使用されます。ここでは、コードを書くときにより明確に理解できるように、デリゲートとイベントの使用法とその理由について詳しく説明します。
委任の使用
イベントはメカニズムであり、イベントは委任によって実装されるため、委任を理解すると、イベントについてより深く理解できるようになります。以下に小さな例を見てみましょう。
これは、さまざまな言語でプログラマーを記述するためのコードです:
たとえば、次のように 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 までご連絡ください。
azure/awsへのc#.netアプリケーションの展開:ステップバイステップガイドazure/awsへのc#.netアプリケーションの展開:ステップバイステップガイドApr 23, 2025 am 12:06 AM

c#.netアプリをAzureまたはAWSに展開する方法は?答えは、AzureAppServiceとAwselasticBeanStalkを使用することです。 1。Azureでは、AzureAppServiceとAzurePipelinesを使用して展開を自動化します。 2。AWSでは、Amazon ElasticBeanstalkとAwslambdaを使用して、展開とサーバーレス計算を実装します。

C#.NET:強力なプログラミング言語の紹介C#.NET:強力なプログラミング言語の紹介Apr 22, 2025 am 12:04 AM

C#と.NETの組み合わせにより、開発者に強力なプログラミング環境を提供します。 1)C#は、多型と非同期プログラミングをサポートします。2).NETは、クロスプラットフォーム機能と同時処理メカニズムを提供し、デスクトップ、Web、モバイルアプリケーション開発で広く使用されています。

.NETフレームワーク対C#:用語のデコード.NETフレームワーク対C#:用語のデコードApr 21, 2025 am 12:05 AM

.NetFrameworkはソフトウェアフレームワークであり、C#はプログラミング言語です。 1..netframeworkは、デスクトップ、Web、モバイルアプリケーションの開発をサポートするライブラリとサービスを提供します。 2.C#は.NetFrameWork用に設計されており、最新のプログラミング機能をサポートしています。 3..NetFrameworkはCLRを介してコード実行を管理し、C#コードはILにコンパイルされ、CLRによって実行されます。 4. .NetFrameWorkを使用してアプリケーションをすばやく開発し、C#はLINQなどの高度な関数を提供します。 5.一般的なエラーには、タイプ変換と非同期プログラミングデッドロックが含まれます。 VisualStudioツールは、デバッグに必要です。

C#.NETの分解:初心者の概要C#.NETの分解:初心者の概要Apr 20, 2025 am 12:11 AM

C#は、Microsoftが開発した最新のオブジェクト指向プログラミング言語であり、.NETはMicrosoftが提供する開発フレームワークです。 C#は、CのパフォーマンスとJavaのシンプルさを組み合わせており、さまざまなアプリケーションの構築に適しています。 .NETフレームワークは、複数の言語をサポートし、ガベージコレクションメカニズムを提供し、メモリ管理を簡素化します。

C#と.NETランタイム:それらがどのように連携するかC#と.NETランタイム:それらがどのように連携するかApr 19, 2025 am 12:04 AM

C#と.NETランタイムは密接に連携して、開発者に効率的で強力なプラットフォームの開発機能に力を与えます。 1)C#は、.NETフレームワークとシームレスに統合するように設計されたタイプセーフおよびオブジェクト指向のプログラミング言語です。 2).NETランタイムは、C#コードの実行を管理し、ガベージコレクション、タイプの安全性、その他のサービスを提供し、効率的でクロスプラットフォームの操作を保証します。

C#.NET開発:始めるための初心者向けガイドC#.NET開発:始めるための初心者向けガイドApr 18, 2025 am 12:17 AM

C#.NET開発を開始するには、次のことが必要です。1。C#の基本的な知識と.NETフレームワークのコア概念を理解する。 2。変数、データ型、制御構造、関数、クラスの基本概念をマスターします。 3。LINQや非同期プログラミングなど、C#の高度な機能を学習します。 4.一般的なエラーのためのデバッグテクニックとパフォーマンス最適化方法に精通してください。これらの手順を使用すると、C#.NETの世界に徐々に浸透し、効率的なアプリケーションを書き込むことができます。

C#と.NET:2つの関係を理解し​​ますC#と.NET:2つの関係を理解し​​ますApr 17, 2025 am 12:07 AM

C#と.NETの関係は切り離せませんが、同じものではありません。 C#はプログラミング言語であり、.NETは開発プ​​ラットフォームです。 C#は、コードの書き込み、.NETの中間言語(IL)にコンパイルされ、.NET Runtime(CLR)によって実行されるために使用されます。

c#.netの継続的な関連性:現在の使用法を見るc#.netの継続的な関連性:現在の使用法を見るApr 16, 2025 am 12:07 AM

C#.NETは、複数のアプリケーション開発をサポートする強力なツールとライブラリを提供するため、依然として重要です。 1)C#は.NETフレームワークを組み合わせて、開発を効率的かつ便利にします。 2)C#のタイプの安全性とゴミ収集メカニズムは、その利点を高めます。 3).NETは、クロスプラットフォームの実行環境とリッチAPIを提供し、開発の柔軟性を向上させます。

See all articles

ホット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 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SublimeText3 中国語版

SublimeText3 中国語版

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

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!