using System;
namespace ConsoleApplication3
{
public delegate void MyDelegate(string str);
class Class1
{
private static void Hello(string str){
Console.WriteLine("Hello "+str);
}
private static void GoodBye(string str){
Console.WriteLine("GoodBye "+str);
}
static void Main(string[] args)
{
MyDelegate a,b,c,d;
a = new MyDelegate(Hello);
b = new MyDelegate(GoodBye);
c = a + b;
d = c - a;
a("A");
b("B");
c("C");
d("D");
Console.ReadLine();
}
}
}
我的理解就是,delegate就是一個函數的指針,用他聲明的變量實質上就是一個函數,這就要求綁定的時候函數的返回值和參數列表必須符合delegate聲明時候的要求。
這時候,我來比較一下event
this.Load += new System.EventHandler(this.Page_Load);
很顯然,這裡的this.Load是一個事件,也是一個delegate,而這裡的System.EventHandler()也是一個delegate,而且,他的返回值與參數列表和this.Load是相同的。這時候綁定的Page_Load,是System.EventHandler綁定的一個具體的函數,跟前兩者的返回值和參數列表都相同。當this.Load事件發生的時候,觸發了新new的System.EventHandler,從而運行了Page_Load.
找到了一個例子,事件處理的
using System;
public class EventTest
{
public delegate void MyEventHandler(object sender,System.EventArgs e);
public static void MyEventFunc(object sender,System.EventArgs e)
{
Console.WriteLine("My Event is done!");
}
private event MyEventHandler myevent;
public EventTest()
{
this.myevent+=new MyEventHandler(MyEventFunc);
}
public void RaiseEvent()
{
EventArgs e=new EventArgs();
if(myevent!=null)
myevent(this,e);
}
public static void Main()
{
EventTest et=new EventTest();
Console.WriteLine("Please input a");
if(Console.ReadLine()=="a")
et.RaiseEvent();
else
Console.WriteLine("Error");
}
}
在這裡myEvent是一個事件,也是一個delegate,給他加了一個處理的的delegate,也就是一個eventHandler,就是給這個事件添加的處理函數。在構造函數裡面,把MyEventFunc和handler進行綁定。那麼,如果觸發了事件,就執行綁定的函數MyEventFunc.
Ivony 發表於 2005-03-03 10:47 AM
event就是delegate,只不過是delegate的縮減功能版,或者說受限版。。。。event去掉了delegate的直接賦值功能,其他與delegate一樣。
也就是說event就是一個不能使用=運算符的delegate。