委托
委托是一种引用方法的类型,一旦为委托分配了方法,委托将具有该方法完全相同的行为
委托的调用和方法一样,都具有参数和返回值
方法的签名:修饰符,返回值类型,参数名,参数列表
委托的签名:(由返回类型和参数组成)匹配的任何类或结构下任何的方法都可以分配给该委托,(方法可以是静态方法,也可以是实例方法)
这样就可以通过编程的方法来更改方法的调用,还可以向现有类中插入代码
只要知道委托的签名,就可以分配自己的委托方法
委托的签名不一定是和方法的签名相同,但是却是相互匹配的
协变 返回值:先经由方法,再传递给委托 委托返回值>方法返回值
逆变 参数:先经由委托,再传递给方法 方法参数类型>委托参数类型
多播委托 一个委托调用多个方法
Dele dele1 = MethodName1; Dele dele2 = MethodName2; Dele dele = dele1 + dele2;
委托的定义:delegate Person Dele();
方法的定义:Student MethodName(){...}
委托调用方法:Dele dele = new Dele(MethodName) || Dele dele = MethodName; || dele += MethodName;
委托的特点:
委托类似于C++的函数指针,但它们是类型安全的
委托允许将方法作为参数传递
1 delegate void Dele(); 2 3 static void ShowTime() 4 { 5 Console.WriteLine("现在是北京时间:"+DateTime.Now); 6 } 7 8 static void ShowPeople(Dele dele) 9 { 10 dele(); 11 Console.WriteLine("现在是张三的ShowTime"); 12 } 13 14 static void Main(string[] args) 15 { 16 Dele dele = ShowTime; 17 dele += new Dele(ShowTime); 18 ShowPeople(dele); 19 }
委托可用于定义回调方法
委托可以链接在一起,例如,可以同一时间调用多个方法
方法不必和委托签名完全匹配(协变)
委托类型派生自.NET Framework中的Delegate类
委托类型是密封的,不能从Delegate中派生委托类型,也不可能从中派生自定义类
由于实例化委托是一个对象,所以可以将其作为参数传递,也可以将其赋值给属性。这样,方法便可以将委托作为一个参数来接受,并且以后也可以调用该委托
这称为异步回调,是在较长的进程完成后用来通知调用方的方法
以这种方式使用委托时,使用委托的代码无需了解有关所用方法实现方面的任何信息
异步回调代码示例:
1 delegate void Dele(DateTime dt); 2 3 static void Main(string[] args) 4 { 5 Dele dele = new Dele(ShowTime); 6 AsyncCallback callback = new AsyncCallback(FAsyncCallback); 7 IAsyncResult ar = dele.BeginInvoke(DateTime.Now,callback, null); 8 9 while (true) 10 { 11 Console.WriteLine(Console.ReadLine()); 12 } 13 } 14 15 static void ShowTime(DateTime dt) 16 { 17 while (true) 18 { 19 Console.Title = DateTime.Now.ToString(); 20 Thread.Sleep(1000); 21 } 22 }

浙公网安备 33010602011771号