C#中的拜托引見。本站提示廣大學習愛好者:(C#中的拜托引見)文章只能為提供參考,不一定能成為您想要的結果。以下是C#中的拜托引見正文
甚麼是拜托?
之前寫了事宜的引見:http://www.jb51.net/article/59461.htm
這裡也把拜托相干常識也總結一下。
拜托是c#中類型平安的,可以定閱一個或多個具有雷同簽名辦法的函數指針
聲明拜托的方法:delegate 前往值類型 拜托類型名(參數)
好比:
delegate void StringProcess(string s);
留意:這裡的除後面的delegate,剩下部門和聲明一個函數一樣,然則StringProcess不是函數名,而是拜托類型名
聲明的拜托是一品種型,就像int、Person一樣,假如要用的話還要聲明拜托類型的變量,聲明拜托類型變量的方法:StringProcess f1;
將拜托類型變量指向函數 StringProcess sp = new StringProcess(SayHello),如許便可以像挪用通俗函數一樣把sp當做函數用了。拜托可以看作是函數的指針。整數可以用整數變量指向它,對象可以用對象變量指向它,函數也能夠用拜托變量指向它。和直接挪用函數的差別:用拜托便可以指向隨意率性的函數,哪怕是之前沒界說的都可以,而不應用受限於那幾種。
將拜托類型變量指向函數還可以簡化成StringProcess sp = SayHello,編譯器幫我們停止了new。然則不克不及sp=PrintIt(),由於如許就成了函數挪用。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Wolfy.DelegateTest
{
class Program
{
delegate void StringProcess(string s);
static void Main(string[] args)
{
string s = "HI,I AM WOLFY";
string s2 = "HOW DO YOU DO?";
//界說拜托變量p
StringProcess p = new StringProcess(ToLower);
//簡化方法
StringProcess p2 = ToLower;
p(s);
p2(s2);
Console.Read();
}
static void ToLower(string s)
{
Console.WriteLine(s.ToLower());
}
}
}
成果:
StringProcess p2 = ToLower;
這類簡化方法,編譯器究竟為我們做了甚麼?可以經由過程反編譯對象看一下:
可以見編譯器幫我們new了一個。
前往類型和簽名指定了拜托的接收辦法的情勢:也就是你的拜托是甚麼款式的,指向的辦法也如果甚麼款式的,好比這裡前往類型為void 參數是string類型的。
匿名辦法
應用Delegate的時刻許多時刻沒需要應用一個通俗的辦法,由於這個辦法只要這個Delegate會用,而且只用一次,這時候候應用匿名辦法最適合。
匿名辦法就是沒著名字的辦法。3就是沒著名字的int對象。3+5就是兩個匿名int對象的相加,許可匿名對象,就許可匿名辦法。
ProcessWordDelegate p = delegate(string s)
{
Console.WriteLine(s);
};
曉得C#中有匿名辦法,看到這類寫法曉得是匿名函數便可
多播拜托*
拜托的增減辦法
d+=SayHello,為拜托增長一個辦法,不要感到奇異,由於它就是d=d+ SayHello
d-=SayHello,將辦法從拜托中移除。
留意:在應用多播拜托的時刻,普通是讓拜托指向前往值為void的辦法,否則會籠罩前往值,輸入最初一個辦法的前往值。
class Program
{
delegate int IntProcess(int a, int b);
static void Main(string[] args)
{
IntProcess p = Add;
p += Minus;
int result = p(1, 2);
Console.Write(result);
Console.Read();
}
static int Add(int a, int b)
{
return a + b;
}
static int Minus(int a, int b)
{
return a - b;
}
}
成果為:-1。
從成果可以看出是前往了最初一個辦法Minus。
拜托的實質
其實就是一個類把辦法包裝了一下,拜托都繼續自System.MulticastDelegate,而System.MulticastDelegate又繼續自System.Delegate
多播拜托就是有一個拜托數組,順次挪用