先說說C#中事件的用法,從事件的用法中,我自己會產生一個疑惑
C#事件
class Program { static void Main(string[] args) { EventClass ec = new EventClass(); ec.hd += new EventClass.HandleDelegate(ec_hd); string str = ec.OnClick("aaaaaaaaaaaaaaa");//我的困惑出現在這里 Console.WriteLine(str); Console.ReadKey(); } public static string ec_hd(string str) { return str; } } class EventClass { public delegate string HandleDelegate(string str); public event HandleDelegate hd; public string OnClick(string str) { return hd(str); } } }
以前,Button對象添加事件,也就是btn.Click+=Button1_Click;這樣就完事了,但是不理解到底是誰調用了這個委托,也就是像上述代碼中“ string str = ec.OnClick("aaaaaaaaaaaaaaa");//我的困惑出現在這里 ”的這行。
通過反編譯工具,知道了這個是如何調用的,反編譯Button類就能看到,以下簡要說明:
以下是執行Click事件添加的代碼:
// Events [WebCategory("Action"), WebSysDescription("Button_OnClick")] public event EventHandler Click { add { base.Events.AddHandler(EventClick, value); } remove { base.Events.RemoveHandler(EventClick, value); } }
這段代碼就是+=操作調用的代碼,將Click事件添加到Events集合中
關於Events集合,它是一個屬性,就返回一個events對象,這個events對象是EventHandlerList類型的,集合的鍵是object類型的,值當然就是EventHandle。
然后解惑的代碼如下:
protected virtual void OnClick(EventArgs e) { //在事件集合中,返回Click事件對象,然后調用 EventHandler handler = (EventHandler) base.Events[EventClick]; if (handler != null) { handler(this, e);//這段代碼就是類似第一段代碼中的ec.OnClick("aaaaaaaaaaaaaaa");
}
}
至於OnClick方法是如何調用的, 涉及到更深層的操作,比如按鈕是怎么點擊的,這些沒必要了解。
本文只是為了解決本人的一些疑惑。
但也給出調用OnClick的代碼:
protected virtual void RaisePostBackEvent(string eventArgument) { base.ValidateEvent(this.UniqueID, eventArgument); if (this.CausesValidation) { this.Page.Validate(this.ValidationGroup); } this.OnClick(EventArgs.Empty); this.OnCommand(new CommandEventArgs(this.CommandName, this.CommandArgument)); }
