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

|