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#中的事件的用法