C#中的委託

來源:互聯網
上載者:User

標籤:

 

 做項目一段時間,經常用到委託和一些Lambda運算式,在這裡也對這些東西總結一下。


 1.什麼是委託?

 說實在的,用了這麼多,突然讓說一下委託的定義,確實還有難度。在我看來,委託跟平常的方法差不多,但是功能卻十分的強大。強大到什麼地方呢?方法中可以有參數,委託既然類似於方法,所以也有參數,但是參數的內容可以是方法。

 

 

 2.委託用法

 委託在用法上與類的用法又特別的相同,比如在使用某個類的時候,必須先進行執行個體化。下面看一個Demo

<span style="font-family:SimSun;font-size:18px;">namespace ConsoleApplication1{    public class B    {        //定義一個委派物件        //因為委託中傳入的是方法,在此委託就好比是一些方法的模型        //比如這時定義的一個委託,就要求傳入的方法傳回值是void        //參數必須是一個string類型的字串        delegate void Test(string name);        //測試方法一        public static void Test1(string name)        {            Console.WriteLine(name);        }        //測試方法二        public static void Test2(string age)        {            Console.WriteLine(age);        }        //使用委託        static void Main(string[] args)        {            //使用委託            //用法與類相似,用前必須先執行個體化一個委派物件            Test test = new Test(Test1);            //通過執行個體化後,該委託就成為了方法的一個代理            test("校長");                         Console.ReadLine();        }    }}</span>


 小結:通過上述代碼,我們也看到,在用法上委託與類相似,在功能上與方法相似。



  3.匿名委託

  看了上述的代碼,基本上算是對委託有了初步的理解,只要掌握以下用法即可。下面來看一下,匿名委託,與委託一樣,只不過變了一下模樣而已。

 

<span style="font-family:SimSun;font-size:18px;">  public class C     {        static void Main(string[] args)        {             //以前用的時候還需要執行個體化,現在又了匿名的委託            //不用再執行個體化委派物件了            //採用Lambda運算式書寫的一個匿名委託            DelCompare del = (t1, t2) => { return t1+t2; };            //直接匿名委託            DelCompare del1 = delegate(int t1,int t2) { return t1+t2; };            //調用委託方法            int n = del(3, 4);            int n1 = del1(3, 4);                    }    }</span>


 上述代碼只不過是在委託的基礎上,變了一下型而已。到底,通過上述兩次代碼展示,我們已經知道用委託的方法已經有三種形式了。


 4.非同步委託

   小編在學習委託的時候,看了一下MSDN文檔,發現了一個好東西。非同步委託。

   BeginInvoke 方法:在建立控制項的基礎控制代碼所線上程上非同步執行指定委託。

   具體的實現原理,也不是很清楚,但是看到非同步執行指定委託,小編就有點興奮了。於是小編那這個方法執行委託,與上述進行的對比,發現能夠快上1000倍。什麼都不說了,直接上代碼吧!


<span style="font-family:SimSun;font-size:18px;">   delegate void DelTest();    public class D    {        //回呼函數,當非同步委託的方法執行完畢之後調用的方法        public static   void Callback(IAsyncResult ar)        {            Console.WriteLine("OVER");              }        static void Main(string[] args)        {            //執行個體化委派物件            DelTest del = Test;            //委託的非同步呼叫            del.BeginInvoke(Callback, null);            Console.WriteLine("測試");        }        public static void Test()        {            Console.WriteLine("測試");        }    }</span>

  5.Action<T> 委託和Func<T,TResult> 委託

    貼心的微軟,真的是為人民服務哈。看看上面我們用委託的繁瑣的過程,於是微軟基於這點考慮,給我們封裝了兩個函數。


    Func<T,TResult> :封裝一個具有一個參數並返回TResult 參數指定的類型值的方法。            

    Action<T>:封裝一個方法,該方法只有一個參數並且不返回值。

    這兩者的區別就是在於有沒有返回值,具體的執行個體,可以參考MSDN,在此就略微的提一下。

   






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.