委託,英文叫Delegate。它和C或C++中的函數指針十分相似,或者說委託是高級的函數指針。它具備兩大特色:面向對象,類型安全和可靠的。安全
代碼以下:函數
namespace DelegateDemothis
{spa
public delegate void SayHandler(string name);指針
class Programorm
{對象
protected void SaySmt(string name)事件
{get
Console.WriteLine("Hello " + name);string
}
static void Main(string[] args)
{
Program p = new Program();
//實例化委託
SayHandler objSay = new SayHandler(p.SaySmt);
objSay.Invoke("委託");
//實例化委託
SayHandler objSay2 = p.SaySmt;
objSay2("委託");
Console.ReadKey();
}
}
}
經過上面代碼也能夠看出,委託其實也是一種與class、interface等相似的數據類型。委託就是對被委託函數的一次封裝,它能夠實例化,它是經過delegate關鍵字進行聲明的,今後能夠看出委託是面向對象的。
委託是類型安全的意思是指,委託的簽名要和被委託的函數的簽名一致,若是不一致,系統在編譯時就會報錯。而對於通常的函數指針來講,一般是在運行時纔會發現這種錯誤。
在C#中,事件就是當對象發生某些事情時,向該對象的客戶提供通知的一種方法。.NET的事件模型創建在委託機制之上,它實現了對委託的封裝。所以它是一種特殊類型的委託,更確切的說是一個多播委託(MultiDelegate)。意思是指能夠將多個事件處理函數委託交由一個事件進行託管,即當事件引起時,會調用其中的每個委託函數。下面以一個貓和老鼠的例子加以說明:當貓發出叫聲的時候,老鼠就會對這個事件做出響應。
namespace CatAndMouse
{
class Program
{
static void Main(string[] args)
{
Cat cat = new Cat("Caffee");
Mouse mouse = new Mouse();
mouse.SetCat(cat);
cat.InvokeMew();
Console.ReadLine();
}
}
/// <summary>
/// 聲明一個叫聲委託
/// </summary>
/// <param name="cat"></param>
public delegate void MewHandler(Cat cat);
public class Cat
{
public string Name
{
get;
set;
}
public Cat(string name)
{
this.Name = name;
}
//聲明事件
public event MewHandler Mew;
/// <summary>
/// 事件觸發函數
/// </summary>
/// <param name="words"></param>
protected void OnCatMew()
{
if (Mew != null)
{
Mew(this);
}
}
/// <summary>
/// 引起事件的方法
/// </summary>
public void InvokeMew()
{
OnCatMew();
}
}
public class Mouse
{
private Cat hatedCat;
public void SetCat(Cat cat)
{
this.hatedCat = cat;
//將事件處理函數與事件綁定
hatedCat.Mew += new MewHandler(cat_Mew);
}
//事件處理函數(與委託具備相同的簽名)
void cat_Mew(Cat cat)
{
Console.WriteLine(string.Format("Shit!{0} Cat is Coming,Let’s go!", cat.Name));
}
}
}
根據以上代碼可知事件的大體實現流程:
一、 聲明事件源,即Cat對象
二、 事件接收者,即Mouse類
三、 定義引起事件,即InvokeMew()方法。
四、 關聯事件和事件處理方法,即hatedCat.Mew += new MewHandler(cat_Mew);
五、 客戶端調用引起事件,即cat.InvokeMew();
一樣道理,對於界面控件的系統事件來講,其實現代碼大體以下:
protected void Page_Load(object sender, EventArgs e)
{
Button1.Click += new EventHandler(Button1_Click);
}
void Button1_Click(object sender, EventArgs e)
{
//作相應的處理
}
其實現流程和上一實例同樣,只是委託不用本身定義,系統已經自定義好了,爲EventHandler,它要求它委託的函數有兩個參數,一個是Sender,即事件源信息,另外一個e爲封裝的具體消息內容。事件名稱Click也是系統定義好的,所以使用起來比較方便。