ホームページ バックエンド開発 C#.Net チュートリアル C# の委任の += と -= の詳細な説明

C# の委任の += と -= の詳細な説明

Apr 21, 2017 pm 02:15 PM
c#

この記事では、C# のデリゲーションの += と -= について詳しく紹介します。この記事では、C# デリゲーションの理解と使用法をさらに深めるために、+= と -= が実行中に何をするのかについて詳しく説明します。次に

前に書いています

なぜ突然委任について話したいのですか?その理由は、昨日仕事を降りる途中にこの問題について考えていたことから始まりました。複数の委任メソッドを登録した場合、実行はすべて失われますか?自然を探索するために、それを研究するためのデモを作成しました。

+=

デリゲートは System.MulticastDelegate を継承し、System.MulticastDelegate は System.Delegate を継承することは誰もが知っています。 += を使用してデリゲートの複数のメソッドを登録できます。それで、それらはすべて実装されましたか?実行の結果は何ですか?戻り値がある場合とない場合で結果は同じですか?それから、+= が何をしたかについて話してみてください。

テストコード

コードは次のとおりです:

namespace Wolfy.DelegateDemo
{
    public delegate void ShowMsg(string msg);
    public delegate int MathOperation(int a, int b);
    class Program
    {
        static ShowMsg showMsg;
        static MathOperation mathOperation;
        static void Main(string[] args)
        {
            showMsg += ShowHello;
            showMsg += ShowHello1;
            showMsg("大家新年好啊");
            mathOperation += Add;  
            mathOperation += Multiply;
            int result = mathOperation(1, 2);
            Console.WriteLine(result.ToString());
            Console.Read();
        }
        static void ShowHello(string msg)
        {
            Console.WriteLine("哈喽:" + msg);
        }
        static void ShowHello1(string msg)
        {
            Console.WriteLine("哈喽1:" + msg);
        }
        static int Add(int a, int b)
        {
            return a + b;
        }
        static int Multiply(int a, int b)
        {
            return a * b;
        }
    }
}
ログイン後にコピー

以下に示すように、実行結果を推測できます:

戻り値のないものはすべて出力され、戻り値のあるものはすべて出力されていることがわかりますMutiply の結果のみを出力し、+=内部で何が行われるか?逆コンパイルされたコードを見てみましょう:

コードは次のとおりです:

using System;
namespace Wolfy.DelegateDemo
{
    internal class Program
    {
        private static ShowMsg showMsg;
        private static MathOperation mathOperation;
        private static void Main(string[] args)
        {
            Program.showMsg = (ShowMsg)Delegate.Combine(Program.showMsg, new ShowMsg(Program.ShowHello));
            Program.showMsg = (ShowMsg)Delegate.Combine(Program.showMsg, new ShowMsg(Program.ShowHello1));
            Program.showMsg("大家新年好啊");
            Program.mathOperation = (MathOperation)Delegate.Combine(Program.mathOperation, new MathOperation(Program.Add));
            Program.mathOperation = (MathOperation)Delegate.Combine(Program.mathOperation, new MathOperation(Program.Multiply));
            Console.WriteLine(Program.mathOperation(1, 2).ToString());
            Console.Read();
        }
        private static void ShowHello(string msg)
        {
            Console.WriteLine("哈喽:" + msg);
        }
        private static void ShowHello1(string msg)
        {
            Console.WriteLine("哈喽1:" + msg);
        }
        private static int Add(int a, int b)
        {
            return a + b;
        }
        private static int Multiply(int a, int b)
        {
            return a * b;
        }
    }
}
ログイン後にコピー

上記のコードから、+= がデリゲートの Combine 静的メソッドを通じて内部的にデリゲートを結合していることがわかります。デリゲートの静的メソッドがどのように実装されるかについて。

最終的に CombineImpl メソッドが呼び出されていることがわかります。このメソッドの内部は非常に奇妙です。

には、私たちが見たいコードがありません。では、このメソッドは何に使用されているのでしょうか。

MSDN の説明

指定されたマルチキャスト (結合可能な) デリゲートと現在のマルチキャスト (結合可能な) デリゲートの呼び出しリストを連結します。

おそらく、現在のデリゲートを指定されたマルチキャスト デリゲート セットに追加することを意味します。

一周して、戻り値を持つデリゲートは実行されましたか?それはデバッグを通じてのみ確認できます。 (ぐるぐる回って、エディタに戻ってきます)

F11 を続けると、実際に Add メソッド

を入力していることがわかります。実際に実行されますが、マルチキャスト デリゲートを通過するときコレクション、前の値は上書きされます。

これで、次の結論を導き出すことができます。戻り値のないデリゲートの場合は、登録した数と同じ数のメソッドが実行されますが、戻り値のあるデリゲートの場合は、登録された数と同じ数のメソッドが実行されます。メソッドですが、最後のメソッドの戻り値を返します。

-=

+=と言ったからには、後始末をする側として-=も言わなければなりません。プロジェクトで += を使用する場合は、-= を使用して解放する必要があります。それでは内部的には何をしているのでしょうか?また、上記のコードを使用し、結果を出力した後、-= を使用してリソースを解放します。

-= を使用すると、デリゲートの静的メソッド Remove が内部的に呼び出されることがわかります。

-= を使用すると、最終的にデリゲートが null に設定され、null のもう 1 つの意味は、ガベージ コレクターがリサイクルするのを待つことができます。

概要

この質問は非常に基本的なものですが、当時同僚が尋ねたので、私は仕事を終える途中、社内でどのように実装されているのか考え続けました。逆コンパイルして調べてみてください。しかし、CombineImpl メソッドでは満足のいく結果が得られないようです。具体的な実装は見たことがありません。お役に立てれば!

以上がC# の委任の += と -= の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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:34 PM

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

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

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

C# のアクセス修飾子 C# のアクセス修飾子 Sep 03, 2024 pm 03:24 PM

C# のアクセス修飾子のガイド。 C# のアクセス修飾子の種類について、例と出力とともに説明しました。

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

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

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

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

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

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

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

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

See all articles