程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 我對C#中事件委托的通俗看法

我對C#中事件委托的通俗看法

編輯:.NET實例教程

這是我對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類的使用者想要實現一個操作,他只要把他所要的操作定義成一個方法,再把這個方法通過委托,

將其引用傳給shape類的實例,讓這個實例執行這個方法。

這種理解方法雖然不是很規范,但是,對理解C#的事件委托是很有幫助的,希望高手不要笑話。

下面讓我們把shape類完整實現吧(現在就很好理解了):
using System;
namespace WinApp
{
//定義一個事件委托類型,注意不是事件
public delegate void ColorChangeEvent(object sender);
public class shape
{
protected int cvalue;

//根據事件委托類型構造一個事件
public event ColorChangeEvent ColorChange;

public int colorvalue
{
set
{
cvalue = value;
ColorChange(this);//在colorvalue的值發生改變後,觸發事件。
}
get
{
return cvalue;
}
}
public shape()
{
cvalue = 0 ;
}

}
}

下面是使用shape類的例子:
.
.
.
.
private shape trigon = new shape();

/*
通過委托,將trigon_ColorChange方法的引用傳遞給shape的實例,一旦實例中執行了ColorChange,
trigon_ColorChange方法就會被調用
*/
this.trigon.ColorChange += new WinApp.ColorChangeEvent(this.trigon_ColorChange);
.
.
.
private void button1_Click(object sender, System.EventArgs e)
{
this.trigon.colorvalue = 3;
}

private void trigon_ColorChange(object sender)
{
MessageBox.Show("The Color is Changed!");
}
.
.
.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved