委托

委托是一种引用方法类型,一旦为委托分配了方法,委托将具有该方法完全相同的行为

委托的调用和方法一样,都具有参数和返回值

方法的签名:修饰符,返回值类型,参数名,参数列表

委托的签名:(由返回类型和参数组成)匹配的任何类或结构下任何的方法都可以分配给该委托,(方法可以是静态方法,也可以是实例方法)

这样就可以通过编程的方法来更改方法的调用,还可以向现有类中插入代码

只要知道委托的签名,就可以分配自己的委托方法

委托的签名不一定是和方法的签名相同,但是却是相互匹配

协变  返回值:先经由方法,再传递给委托    委托返回值>方法返回值

逆变  参数:先经由委托,再传递给方法       方法参数类型>委托参数类型

多播委托  一个委托调用多个方法

  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         }
View Code

  委托可用于定义回调方法

  委托可以链接在一起,例如,可以同一时间调用多个方法

  方法不必和委托签名完全匹配(协变)

 

委托类型派生自.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         }
View Code

 

posted @ 2017-12-01 15:42  吴祥锋  阅读(149)  评论(0)    收藏  举报