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這個辦法,給的成果不太滿足。沒看到詳細的完成。願望對你有所贊助!