C#中的事件
2024-07-21 02:18:45
供稿:網友
/* 事件和異常相似,它們都由對象引發。但不同之處是,異常由try catch塊處理,而事件需要有訂閱它的主法(事件處理程序)來處理。
* 而且這個函數必須匹配事件的要的求方法簽名,這個簽名由一個委托指定。
* 事件由對象引發后 ,就開始執行它的處理程序。
*/
//下面看個例子
using system;
namespace me
{
public delegate void agehandler(int x);
public class person
{
int age;
public event agehandler ageadd;//用定義好的委托來定義一個事件
public person(int num)
{
age=num;
}
public person():this(0)
{
}
public int age
{
get
{
return age;
}
set
{
if(value>age)//當設定的年齡比現在年齡大時,觸發事件
{
this.ageadd(value-age);//傳給它的參數為增長的年齡
}
age=value;
}
}
}
public class class1
{
public static void main(string[] args)
{
person p=new person(20);
p.ageadd+=new agehandler(p_ageadd);//為person對象p的ageadd事件添
//程序,也就是方法p_ageadd
p.age=25;//觸發事件
}
public static void p_ageadd(int x)//ageadd的事件處理程序
{
console.writeline("增長了"+x+"歲");
}
}
}
/*現在運行程序,會在控制臺輸出"增長了5歲"
* 但 是我們應該發現,很多事件處理程序的參數如下:
* private void button1_click(object sender, system.eventargs e)
* 因為這個處理程序可能處理不止一個事件,所以sender表示了觸發它的對象
* e為由事件傳送的參數
* 下面我們再寫一個程序
*/
using system;
namespace me
{
//寫一類,作用為我們事件傳遞的參數
public class ageeventargs:system.eventargs
{
int oldage;
int newage;
public ageeventargs(int a,int b)
{
oldage=a;
newage=b;
}
public int oldage
{
get
{
return oldage;
}
}
public int newage
{
get
{
return newage;
}
}
public int addage
{
get
{
return newage-oldage;
}
}
}
//定義一個委托,第二個參數我們定義的類型
public delegate void agehandler(object sender,me.ageeventargs e);
public class person
{
public string name;
int age;
public event agehandler ageadd;
public person(int num,string n)
{
age=num;
name=n;
}
public person():this(0,"no name")
{
}
public int age
{
get
{
return age;
}
set
{
if(value>age)
{
this.ageadd(this,new me.ageeventargs(age,value));
}
age=value;
}
}
}
public class class1
{
static void main(string[] args)
{
person p=new person(20,"人");
p.ageadd+=new agehandler(p_ageadd);
p.age=25;
}
static void p_ageadd(object sender,me.ageeventargs e)
{
console.writeline(((person)sender).name);
console.writeline(e.oldage);
console.writeline(e.newage);
console.writeline(e.addage);
}
}
}
//到此,就簡單的說明了c#中的事件的用法