
C#委托、Lambda表达式.doc
6页委托、Lambda表达式1. 委托 2(1) 委托的本质 2(2) 使用委托的示例 2(3) 委托的Invoke与BeginInvoke方法 21、 Invoke方法 22、 BeginInvoke方法 23、 委托的EndInvoke方法 3(4) Action
Delegate:表示委托,委托是一种数据结构,它引用静态方法或引用类实例及该类的实例方法MulticastDelegate:表示多路广播委托;即,其调用列表中可以拥有多个元素的委托2) 使用委托的示例 delegate string DelegateMethod(int a, int b);//定义委托 class Program { static void Main(string[] args) { DelegateMethod dm = new DelegateMethod(Method);//或:DelegateMethod dm = Method Console.WriteLine(dm(10, 20));//执行委托 Console.Read(); } private static string Method(int a, int b) { return "相加结果:" + (a + b); } }(3) 委托的Invoke与BeginInvoke方法1、 Invoke方法实际上,给委托实例提供圆括号与调用委托的Invoke方法效果完全相同: delegate string DelegateMethod(int a, int b);//定义委托 class Program { static void Main(string[] args) { DelegateMethod dm = Method; Console.WriteLine(dm.Invoke(10, 20));//执行委托 Console.Read(); } private static string Method(int a, int b) { return "相加结果:" + (a + b); } }2、 BeginInvoke方法调用委托实例的BeginInvoke方法就是开启一个新的线程执行委托实例指向的方法。
delegate void DelegateMethod(int a, int b);//定义委托 class Program { static void Main(string[] args) { DelegateMethod dm = Method; for (int i = 0; i < 10; i++) { dm.BeginInvoke(i, 20, null, null);//异步调用委托 } Console.Read(); } private static void Method(int a, int b) { Console.WriteLine("相加结果:" + (a + b));//执行委托 } }BeginInvoke方法有三种参数,第一种参数是委托实例指向的方法的参数(可能有多个);第二种参数的类型是AsyncCallback,AsyncCallback是一个委托类型,其定义是delegate void AsyncCallback(IAsyncResult ar),当调用BeginInvoke方法的委托实例异步执行完成时,就会执行该参数指向的方法;第三种参数是object类型,主要是向第二种参数传递一些值,一般可以传递被调用方法的委托,这个值可以使用IAsyncResult.AsyncState属性获得。
具体请参考“C#多线程”) delegate void DelegateMethod(int a, int b);//定义委托 class Program { static void Main(string[] args) { DelegateMethod dm = Method; dm.BeginInvoke(10, 20, MethodCompleted, null);//异步调用委托 Console.Read(); } //异步委托 private static void Method(int a, int b) { Console.WriteLine("相加结果:" + (a + b)); Thread.Sleep(3000); } //回调函数 private static void MethodCompleted(IAsyncResult ar) { Console.WriteLine("休眠结束!"); } }3、 委托的EndInvoke方法如果调用了委托实例的BeginInvoke方法,就可以通过EndInvoke方法获得委托实例指向的方法的返回值,或是确定指向的方法已经被成功调用。
具体请参考“C#多线程”) delegate string DelegateMethod(int a, int b);//定义委托 class Program { static void Main(string[] args) { DelegateMethod dm = Method; IAsyncResult ar = dm.BeginInvoke(10, 20, null, null);//异步调用委托 string result = dm.EndInvoke(ar);//等待委托异步调用结束 Console.WriteLine(result);//输出返回值 Console.Read(); } //异步委托 private static string Method(int a, int b) { Thread.Sleep(3000); return "相加结果:" + (a + b); } }(4) Action
使用泛型委托主要的优势是可以省略委托的定义1、 Action
最多可以有16种参数类型和一个返回值类型) class Program { static void Main(string[] args) { Func
