C#中的事件

/* 事件和异常相似,它们都由对象引发。但不同之处是,异常由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#中的事件的用法

Published At
Categories with Web编程
Tagged with
comments powered by Disqus