C#中的委託(一)

1、委託程序員

      把方法做爲參數傳給其餘方法;數組

2、聲明委託安全

     在C#中使用一個類時,分兩個階段。首先,須要去定義一個類,而後實例化類的一個對象(只須要靜態方法除外)。 使用委託也須要通過這2個步驟,首先必須定義要使用的委託,對於委託,定義它就是告訴編譯器這種類型的委託表示哪一種類型的方法。而後,必須建立該委託的一個或多個實例。編譯器在後臺將建立表示該委託的一個類。定義委託的語法以下:函數

delegate void IntMethodInvoker(int x);

     在這個示例中,定義了一個委託IntMethodInvoker,並指定該委託的每一個實例均可以包含一個方法的引用,該方法帶有一個int參數,並返回void。理解委託的一個要點就是他們的類型安全性很是高。在定義委託時,必須給出它所表示的方法的簽名和返回類型等所有細節;spa

     假設要定義一個委託,該委託表示的方法包含有兩個decimal型的參數,返回類型爲decimal;指針

delegate decimal MethodInvoker(decimal x, decimal y);

3、使用委託code

      首先定義好委託,而後建立該委託的一個或多個實例;假設我要使用上面MethodInvoker的話,代碼以下:對象

MethodInvoker invoker = new MethodInvoker(Math.Max);
decimal x = invoker(5.20m, 5.21m);
Console.WriteLine("x:" + x);

     在這裏咱們把Math.Max(decimal val1,decimal val2) 返回傳給了委託;得出2個值中最大一個值,運行上面代碼能夠獲得以下結果:blog

    若是MethodInvoker委託,只是想獲得2個參數進行一系列操做後返回一個結果。上面的結構就不能知足這個需求,由於已經限制好了參數類型和返回類型。說到這,對泛型熟悉的朋友就應該知道,若是採用泛型去聲明該委託,就能夠解決這個問題了。咱們就接着上面的代碼改造:ci

delegate T MethodInvoker<T>(T x1, T x2);

MethodInvoker<decimal> invoker = new MethodInvoker<decimal>(Math.Max);
decimal x = invoker(5.20m, 5.21m);
Console.WriteLine("x:" + x);
Console.ReadLine();
MethodInvoker<double> invoker1 = new MethodInvoker<double>(Math.Pow);
double x1 = invoker1(10, 3);
Console.WriteLine("x:" + x1);

輸出結果:

 

    參與泛型的方式聲明委託後就能夠知足輸入2個參數進行操做後獲得一個返回結果;

4、簡單委託示例

     定義一個簡單的數據操做類MathOperation,添加2個靜態方法Add(int,int)、Reduce(int,int),兩個方法都返回int類型,代碼以下:

    public class MathOperation
    {
        public int Add(int x, int y)
        {
            return x + y;
        }

        public int Reduce(int x, int y)
        {
            return x - y;
        }
    }

     下面調用這些方法:

          delegate int MathOperDelegate(int x, int y);

            MathOperDelegate[] operation = { 
                                           MathOperation.Add,
                                           MathOperation.Reduce
                                           };

            for (int i = 0; i < operation.Length; i++)
            {
                Console.WriteLine("執行第{0}個委託方法", i);
                for (int j = 1; j < 10; j++)
                {
                    Console.WriteLine("執行結果爲:{0}", operation[i](i, j));
                    Thread.Sleep(20);
                }
            }

     在這段代碼中,實例化了一個MethodDelegate委託的數組,而後遍歷這個數組,而後執行其中的不一樣返回,獲得的結果以下:

5、爲何要使用委託

      使用委託使程序員能夠將方法引用封裝在委託對象內。而後能夠將該委託對象傳遞給可調用所引用方法的代碼,而沒必要在編譯時知道將調用哪一個方法。與C或C++中的函數指針不一樣,委託是面向對象,並且是類型安全的。

相關文章
相關標籤/搜索