這是我對C#中事件的通俗看法,比較適合初學者(其實我也是初學者)對C#事件的理解,本人因為剛入門,在學習C#的事件原理時,發現很多書上寫得很不好理解,不適合初學者,所以我想在這裡談談我對它的看法,可能不是很准確,如果說得對的,請大家鼓鼓掌,不對的或是不規范的地方,還請高手幫忙更正一下,謝謝了。
在學C#之前,我看過《JAVA編程思想》,還有一些Java的入門級的書籍,其中對事件的講解,總是用事件監聽,事件適配器來舉例,
所以我就一直認為,在C#中,RUNTIMING會一直監測每個控件的狀態,如果有控件的狀態發生改變和話,就會觸發事件。
後來仔細看了一些例題之後,發現這個想法真的是很傻的。
其實,理解C#的事件原理,必須明白以下一點:
控件屬性的改變,在它的類中,是由set來改變的,可以理解為由方法(method)來改變的,而不是簡單的賦值。
舉個例子來說明:
class shape
{
private int cvalue;
public shape()
{cvalue = 0;}
public int colorvalue
{
set{cvalue = value;}
get{return cvalue;}
}
}
class MainApp
{
static void Main(string[] argvs)
{
shape trigon = new shape();
trigon.colorvalue = 3;
}
}
假設,當trigon的屬性colorvalue發生改變時,會激發一個ColorChange事件,如果當colorvalue變化時,我們需要它向用戶發送一個信息,例如:MessageBox.Show("The Color is Changed!"),那麼,通常做法是給shape定義一個事件(怎麼樣定義這裡就不講了)ColorValueChange,先假設已定義,所以:
class MainApp
{
static void Main(string[] argvs)
{
shape trigon = new shape();
trigon.ColorChange += EventHandler(this.Shape_ColorValue);
trigon.colorvalue = 3;
}
private void Shape_ColorValueChange(object sender, System.EventArgs e)
{
MessageBox.Show("The Color is Changed!");
}
}
因此,當trigon的ColorValue被改變時,事件會被觸發;上面的情況,和下面的代碼,在結果上是等效的:
class shape
{
private int cvalue;
public shape()
{cvalue = 0;}
public int colorvalue
{
set{cvalue = value; MessageBox.Show("The Color is Changed!");}
get{return cvalue;}
}
}
class MainApp
{
static void Main(string[] argvs)
{
shape trigon = new shape();
trigon.colorvalue = 3;
}
}
但是,一但我們這樣定義一個類,如果shape類的使用者不僅僅是想給用戶一個信息,他還想達到其它目的話,這個辦法就行不通了,所以C#就有了事件委托這個東東。
我是這樣理解事件委托的:委托可以接受一個方法的引用作為參數,然後執行這個方法。
所以,我們只要把MessageBox.Show("The Color is Changed!");換成事件委托就可以了,所以,shape類的使用者想要實現一個操作,他只要把他所要的操作定義成一個方法,再把這個方法通過委托,