開發時,我們幾乎無時無刻不用到事件。然而對於初級開發人員,包括我自己,大多數用的都是.net類庫中的事件。
先看看例子: this.Load += new System.EventHandler(this.Page_Load);
這個估計是asp.net最常用的事件了。將Page對象的Load事件委託到Page_Load()方法進行處理。
看看各成員的類型:
this 是System.Web.UI.Page類型
this.Load 是System.EventHandler類型的事件event
物件瀏覽器對Page.Load的解釋public event System.EventHandler Load
System.Web.UI.Control 的成員
摘要:
當伺服器控制項載入到 System.Web.UI.Page 對象中時發生。
SystemEventHandler 是一個delegate委託,原形是[C#]
[Serializable]
public delegate void EventHandler(
object sender,
EventArgs e
);
在mscorlib包,也就是.net基礎架構中。VS.net2003物件瀏覽器如是解釋public sealed delegate EventHandler : System.MulticastDelegate
System 的成員
摘要:
表示將處理不包含事件數目據的事件的方法。
this.Page_Load是一個void方法
使用過程是這樣,所有事件相關的東西都要依賴於一個委託delegate,先聲明委託。delegate void SomeDelegate();
然後在類中定義一個該委託類型的事件:event SomeDelegate AnEvent;
在然後在對象執行個體化之後,事件發生之前(當然大部分是在建構函式中)將一個方法串連到委託
this.AnEvent += new SomeDelegate(this.EventRaise);
同時聲明一個方法
void EventRaise(){}
最後在需要引發事件的地方調用this.AnEvent()
看個例子 class Class1
{
[STAThread]
static void Main(string[] args)
{
Test test = new Test();
}
}
public delegate void GeneralEvent_Raise () ;
public class Test
{
public event GeneralEvent_Raise GeneralEvent ;
public Test()
{
GeneralEvent += new GeneralEvent_Raise(Test_GeneralEventRaise);
GeneralEvent();
}
public void Test_GeneralEventRaise()
{
System.Console.WriteLine("Raise!");
}
}
代碼比較簡單,不詳細說了。這樣在運行時就會看到輸出“Raise!”。
看到+=突然產生興趣,既然不是直接用“=”,是不是可以把一個事件串連到多個委託
修改Test建構函式 public Test()
{
GeneralEvent += new GeneralEvent_Raise(Test_GeneralEventRaise);
GeneralEvent += new GeneralEvent_Raise(Test_GeneralEventRaise);
GeneralEvent();
}
再運行看到什嗎?是的,一個事件引發了兩個處理。那麼如何去掉委託呢 public Test()
{
GeneralEvent += new GeneralEvent_Raise(Test_GeneralEventRaise);
GeneralEvent = null;
GeneralEvent += new GeneralEvent_Raise(Test_GeneralEventRaise);
GeneralEvent();
}
再看看,只觸發了一次。用什麼辦法制定只有一個委託處理事件呢 GeneralEvent += new GeneralEvent_Raise(Test_GeneralEventRaise);
GeneralEvent = new GeneralEvent_Raise(Test_GeneralEventRaise);
仍然是一次。
不知道不給事件定委託是什麼樣子 public Test()
{
GeneralEvent();
}
異常了吧。如果想自定異常可以這樣做 if ( GeneralEvent != null )
{
GeneralEvent();
}
else
{
throw new Exception("事件不會被處理!");
}
在被依賴項目中定義好委託和事件,在下級項目中實現委託並把委託+到事件上,對於一些設計時未知的處理效果會相當好