程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> c#委托的理解和基礎學習

c#委托的理解和基礎學習

編輯:C#入門知識

c#委托的理解和基礎學習




C#委托的理解和基礎學習

Delegate,委托,是c#中非常重要的一個概念,使用委托使程序員可以將方法引用封裝在委托對象內。然後可以將該委托對象傳遞給可調用所引用方法的代碼,而不必在編譯時知道將調用哪個方法。與C或C++中的函數指針不同,委托是面向對象,而且是類型安全的。用最通俗易懂的話來講,你就可以把委托看成是用來執行方法(函數)的一個東西。在使用委托的時候,你可以像對待一個類一樣對待它。即先聲明,再實例化。只是有點不同,類在實例化之後叫對象或實例,但委托在實例化後仍叫委托。

比如:

delegate int GetCalculatedValueDelegate(int x, int y);

在上面的定義中,我們定義了一個委托,這個委托代表著一類函數,這些函數的第一個參數是整數型的x,第二個參數是整數型的y,而函數的返回值則是一個整數。在這裡,為了描述方便,我們把這一類的函數稱為具有相同簽名(signature)的函數(注意:這個簽名並不是數字簽名中的概念,而只是表示這類函數具有相同的參數列表和返回值)。

既然委托是一種類型,那麼它就能被用來定義參數、變量以及返回值。由委托定義的變量用於保存具有相同簽名的函數實體。需要注意的是,C#和C++不同,C++中的函數指針只能保存全局的或者靜態的函數,而C#中的委托實體則可以指代任何函數。

現在我們來看一個例子,
	delegate string Get();

        static string _1(Get get)
        {
            return get();
        }

        static string _2()
        {
            return "123";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            label1.Text = _1(_2);
        }
上面的例子是一個基於窗體的例子,但窗體大多數讀者都應該能做出來,如果確實需要解決方案(VS裡的),在文章末尾有筆者的聯系方式。 到這裡也就能基本上明白“委托”的意義了,本來需要調用_2函數的,卻通過_1來調用了,也就是,_2的操作由_1的參數中的委托代為效勞。本來是要小明去老師辦公室拿粉筆盒的,由於小明和小文是好朋友,因此小明就要小文代他去拿,於是小文成了小明的代理,小明委托小文去拿粉筆盒。 忘了一點,委托也可以有返回值和參數,這個函數差不多,但跟函數有一定的區別,委托是代為別人效勞。

委托作為參數,在C#中非常常見。比如線程的創建,需要給一個ThreadStart或者ParameterizedThreadStart委托作為參數,而在線程執行的時候,將這個參數所指代的函數用作線程執行體。再比如:List類型的Find方法的參數也是一個委托,它把“怎麼去查找”或者說“怎麼樣才算找到”這個問題留給了開發人員。開發人員只需要定義一個參數為T,返回值為布爾型的函數,實現函數體,並將函數作為參數傳給Find方法,就可以完成集合中元素的查找。

委托作為返回值一般會用在“根據不同情況決定使用不同的委托”這樣的情形下。這有點像工廠模式,不過委托用作返回值還是用的沒有用作參數這樣頻繁。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved