C#中的委託(一)

來源:互聯網
上載者:User

標籤:委託方   ges   多個   技術分享   限制   數組   其他   add   最大   

一、委託

      把方法作為參數傳給其他方法;

二、聲明委託

     在C#中使用一個類時,分兩個階段。首先,需要去定義一個類,然後執行個體化類的一個對象(只需要靜態方法除外)。 使用委託也需要經過這2個步驟,首先必須定義要使用的委託,對於委託,定義它就是告訴編譯器這種類型的委託表示哪種類型的方法。然後,必須建立該委託的一個或多個執行個體。編譯器在後台將建立表示該委託的一個類。定義委託的文法如下:

delegate void IntMethodInvoker(int x);

     在這個樣本中,定義了一個委託IntMethodInvoker,並指定該委託的每個執行個體都可以包含一個方法的引用,該方法帶有一個int參數,並返回void。理解委託的一個要點就是他們的型別安全非常高。在定義委託時,必須給出它所表示的方法的簽名和傳回型別等全部細節;

     假設要定義一個委託,該委託表示的方法包含有兩個decimal型的參數,傳回型別為decimal;

delegate decimal MethodInvoker(decimal x, decimal y);

三、使用委託

      首先定義好委託,然後建立該委託的一個或多個執行個體;假設我要使用上面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個值中最大一個值,運行上面代碼可以得到如下結果:

    如果MethodInvoker委託,只是想得到2個參數進行一系列操作後返回一個結果。上面的結構就不能滿足這個需求,因為已經限制好了參數類型和傳回型別。說到這,對泛型熟悉的朋友就應該知道,如果採用泛型去聲明該委託,就可以解決這個問題了。我們就接著上面的代碼改造:

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個參數進行操作後得到一個返回結果;

四、簡單委託樣本

     定義一個簡單的資料操作類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委託的數組,然後遍曆這個數組,然後執行其中的不同返回,得到的結果如下:

五、為什麼要使用委託

      使用委託使程式員可以將方法引用封裝在委派物件內。然後可以將該委派物件傳遞給可調用所引用方法的代碼,而不必在編譯時間知道將調用哪個方法。與C或C++中的函數指標不同,委託是物件導向,而且是型別安全的。

C#中的委託(一)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.