被称为神的男人下载:委托(C#2008)

来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 22:38:27

在C#中,委托是包含方法引用的引用类型。可以将委托人为是指向函数的指针。不是直接调用该,而是使用委托指向函数,然后通过调用委托来调用该方法。

 

1.创建委托

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace Delegates

         classProgram

         {

              delegate int MethodDelegate(int num1,int num2);

              static void Main(string[] args)

              {

                     int num1=5;

                     int num2=3;

                     MethodDelegate method = newMethodDelegate(Add);//MethodDelegate method=Add;

                     if(method != null)

                     {

                          Console.WriteLine(method(num1,num2).ToString());

                     }         

              }

              static int Add(int num1, int num2)

              {

                     return (num1 - num2);

              }

         }

}

 

也可以将委托作为形参传递给方法,如同下例所示:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace Delegates

{

        classProgram

        {

             delegate int MethodDelegate(int num1,int num2);

             static void PerformMathOps(MethodDelegate method, int num1, intnum2)

             {

                   Console.WriteLine(method(num1,num2).ToString());

             }

             static void Main(string[] args)

             {

                    int num1 = 5;

                    int num2 = 3;

                    MethodDelegate method = null;

                    method = new MethodDelegate(Add);

                    if(method != null)

                    {

                          PerformMathOps(method, num1, num2);

                    }

              }

              static int Add(int num1, int num2) 

              {

                    return (num1+num2);

               }

          }

}

 

2.委托链接(多播委托)

   一个委托可以指向多个函数,这称为委托链接。指向多个函数的委托成为多播委托。

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace Delegates

{

        classProgram

        {

             delegate void MethodDelegate();

             static void Main(string[] args)

             {

                   MethodsDelegate methods = Method1;

                   methods += Method2;

                   methods += Method3;

                   methods();

                   Console.ReadLine();

             }

             static private void Method1() 

             {

                   Console.WriteLine("Method 1");

             }

             static private void Method2() 

             {

                   Console.WriteLine("Method 2");

             }

             static private void Method3() 

             {

                   Console.WriteLine("Method 3");

             }

          }

}

 

    调试结果:

        Method 1

        Method 2

        Method 3

 

注意:如果有返回值,只返回为后一个方法的值。若有一个方法异常,不会有返回值。

 

3.使用委托实现回调

   回调是传入函数的方法,在函数结束执行时调用该方法。

   

   如下,有一个执行一系列数学操作的函数。在调用该函数时,也向其传递一个回调方法,从而在函数完成其计算工作时,调用回调方法,向用户通知计算结果。

class Program

{

     delegate void callbackDelegate(string Message);

     static void Main(string[] args)

     {

           callbackDelegate result=ResultCallback;

           AddTwoNumbers(5,3,result);

           Console.ReadLine();

     }

     static private void AddTwoNumbers(int num1, int num2, callbackDelegatecallback)

     {

           int result = num1 + num2;

           callback("The result is :"+ result.ToString());

     }

     static private void ResultCallback(string Message)

     {

           Console.WriteLine(Message);

     }

}

 

callback委托调用ResultCallback()函数,该函数将结果输出到控制台。输出结果如下所示:

    The result is : 8

 

4.异步回调

   回调还是在异步的情况下最为有用。

   上面例子的同步回调情况下的执行流程:

 

   组织程序较好方式是异步调用AddTwoNumbers()方法,如下图所示。异步调用函数允许主程序继续执行,而不需要等待该函数返回。

 

 

 

 

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using Sysstem.Runtime.Remoting.Messaging;

 

namespace Delegates

{

        classProgram

        {

             delegate int MethodDelegate(int num1,int num2);

             tatic void Main(string[] args)

             {

                    MethodDelegate del = AddTwoNumbers;

                    MethodDelegate del = AddTwoNumbers;

                    AsyncCallback callback= new AsyncCallback(ResultCallback);

                   Console.WriteLine("Invoking the method asynchronously...");

                    IAsyncResult result =del.BeginInvoke(5,3,callback,null);

                   Console.WriteLine("Continuing with the execution...");

                    Console.ReadLine();

              }

              static private int AddTwoNumbers(int num1, intnum2)

              {

                   System.Threading.Thread.Sleep(5000);

                    return num1 + num2;

              }

              static private voidResultCallback(IAsyncResult ar)

              {

                    MethodDelegate del =(MethodDelegate)((AsyncResult)ar).AsyncDelegate;

                    int result =del.EndInvoke(ar);

                   Console.WriteLine("Result of addition is:"+result.ToString());

              }

          }

}

 

        AsyncCallback是引用某个方法的委托,当异步操作完成时调用该方法。此处,设置该委托执行ResultCallback;

         使用del委托的BeginInvoke()方法异步调用AddTwoNumbers()方法,并且向该方法传递两个整型值(AddTwoNumbers()方法需要这两个整型值)以及在该方法结束执行时回调的委托。

        BeginInvoke()方法异步调用委托,在调用异步委托之后,下一条语句会继续执行。该方法返回类型为IAsyncResult的变量,该变量表示异步操作的状态。

         定义ResultCallback()方法来获得计算的结果,该方法接受类型为IAsyncResult的实参。

         在ResultCallback()方法中,首先使用AsyncDelegate特性获得指向AddTwoNumbers()方法的委托,该特性返回进行异步调用的委托。接下来,使用EndInvoke()方法获得异步调用的结果,向该方法传递IAsyncResult变量(ar)。