1 委托
委托是函数的引用!其主要用于事件。
委托使用delegate声明,注意,匿名函数也是使用delegate。
委托的使用方法 1)定义委托 2)声明委托 3)实例化委托(为委托添加处理函数) 4)使用委托。
namespace Test { class Program { delegate void dele_test(); //定义委托 static void Main(string[] args) { dele_test dt; //dt = new dele_test(Write); //实例化委托的方法1 dt = Write; //实例化委托的方法2 dt(); //使用委托 Console.Read(); } public static void Write() { Console.Write("这就是委托"); } } }
结果:这就是委托
2 计时器事件
什么是事件?事件和异常相似,在特定的情况下发生!不同的是,异常我们需要捕获try{} catch(){},而事件需要订阅!不多说了,为了复习一下委托,先说一个计时器事件,计时器事件就是在特定的时间发生的事件。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Timers; namespace Test { class Program { public static int i = 0; //定义一个计时器对象,注意引用using System.Timers;名称空间 static void Main(string[] args) { Timer t1 = new Timer(1000); Timer t2 = new Timer(1500); //为计时器事件Elapsed添加响应的委托。 t1.Elapsed += new ElapsedEventHandler(Write1);//通过委托的来添加响应函数 t2.Elapsed += Write1; //直接通过函数名称添加。 t1.Start(); // 启动计时器。 t2.Start(); Console.Read(); } public static void Write1(Object o, ElapsedEventArgs e) { if (((Timer)o).Interval == 1000) { Console.WriteLine("1"); } else { Console.WriteLine("2"); } } } }
结果:1
2
1
1
。。。
Timer的计时器相应事件是Elapsed,我们需要人为的设置事件响应程序。
为事件添加响应程序的方法有两种:
1)使用委托 eg:
t1.Elapsed += new ElapsedEventHandler(Write1);
2)直接使用函数地址(函数名称)
t2.Elapsed += Write1;
3:自定义事件(关键字event)
之前说过,委托的主要功能体现在事件上!事件也不仅仅是“计时器”。
自定义事件步骤: 1) 定义事件 2)为事件添加委托 3)引发事件
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Timers; using System.Threading; namespace Test { public class Test { public class EventTest { public delegate void DeleTest(); public event DeleTest eventTest;//定义事件 public EventTest() { DeleTest dt = new DeleTest(Write1); eventTest += new DeleTest(Write1);//为事件添加委托 也可以 eventTest +=Write1; } public void QiDongEvent() //引发事件。 { eventTest(); //就好像返回类型和参数是有委托指定的函数一样! } } public static int i = 10; static void Main(string[] args) { EventTest et = new EventTest(); while (i > 0) //当i>0的时候,激活一次事件。 { et.QiDongEvent(); Thread.Sleep(1000); } Console.Read(); } public static void Write1() { i--; Console.Write("-" + i); } } }
结果:
4 向事件传递参数
向事件传递参数,需要在被委托指定的函数里面添加两个参数:Object对象,EventArgs抽象类的子类对象。
Object对象代表了调用事件对象的引用!
EventArgs抽象类的子类封装了要传递进去的内容。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Timers; using System.Threading; namespace Test { public class Test { class Args : EventArgs //该类封装了要传递的信息。 { public string name; public Args(string str) { name = str; } } public class EventTest { public delegate void DeleTest(Object o, EventArgs e); public event DeleTest eventTest; public EventTest() { DeleTest dt = new DeleTest(Write1); // eventTest += new DeleTest(Write1); eventTest += Write1; } public void QiDongEvent(string str) //引发事件。 { eventTest(this, new Args(str)); //就好像返回类型和参数是那个被委托指定的函数一样! } } public static int i = 10; static void Main(string[] args) { EventTest et = new EventTest(); while (i > 0) //当i>0的时候,激活一次事件。 { et.QiDongEvent("---" + DateTime.Now.Second.ToString()); Thread.Sleep(1000); } Console.Read(); } public static void Write1(Object o, EventArgs e) { i--; Console.WriteLine(o.ToString() + "-" + i + ((Args)e).name); } } }
结果: