程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中拜托的+=和-=深刻研討

C#中拜托的+=和-=深刻研討

編輯:C#入門知識

C#中拜托的+=和-=深刻研討。本站提示廣大學習愛好者:(C#中拜托的+=和-=深刻研討)文章只能為提供參考,不一定能成為您想要的結果。以下是C#中拜托的+=和-=深刻研討正文


寫在後面

為何會忽然想說說拜托?緣由嗎,起於一個同事的設法主意,昨世界班的路上一向在想這個成績,假如給拜托注冊多個辦法,會不會都履行呢?為了一探討性,就弄了個demo研討下。

+=

年夜家都曉得拜托都繼續自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的說明

Concatenates the invocation lists of the specified multicast (combinable) delegate and the current multicast (combinable) delegate.

年夜概意思就是:將以後的拜托參加到指定的多播拜托聚集中。

繞了一圈那末有前往值的拜托,究竟履行了麼?那也只能經由過程調試來看看了。(繞了一圈,又回到了編纂器,唉)

持續F11你會發明確切進入了Add辦法

也確切履行了,但在遍歷多播拜托聚集的時刻,將之前的值給籠罩了。

那末如今可以得出如許的結論了:無前往值的拜托,你給它注冊若干個辦法,它就履行若干個辦法,而有前往值的拜托,異樣注冊若干個辦法就履行若干個辦法,但前往的是最初一個辦法的前往值。

-=

既然說了+=,那末作為整理爛攤子的-=也不能不說。在項目中應用了+=就要應用-=來釋放。那它外部做了哪些事?異樣應用下面的代碼,在輸入成果後,應用-=來釋放資本。

可以看出,應用-=外部是挪用了拜托的Remove靜態辦法。

應用-=終究是將拜托置為null,為null另外一個意思就是空援用,如許便可以期待渣滓收受接管器停止收受接管了。

總結

這個成績固然很基本,一個同事其時問了,就給他說了一下,鄙人班的路上一向在想,外部是若何完成的?就試著經由過程反編譯的方法一探討竟。但貌似CombineImpl這個辦法,給的成果不太滿足。沒看到詳細的完成。願望對你有所贊助!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved