C#委託(Delegate)精講

前言:C#中的委託類似於C或C++中函數的指針。委託是存有對某個方法的引用的一種引用類型變量,引用可在運行時被改變。更多關於委託的內容,請查看:淺談C#中Action、Func與Predicate委託

一、委託概念

委託類型表示對具有特定參數列表和返回類型的方法的引用。 通過委託,可以將方法視爲可分配給變量並可作爲參數傳遞的實體。

二、聲明委託

在C#中使用一個類分兩個階段,首選定義這個類,告訴編譯器這個類由什麼字段和方法組成的,然後使用這個類實例化對象。在我們使用委託的時候,也需要經過這兩個階段,首先定義委託,告訴編譯器我們這個委託可以指向哪些類型的方法,然後,創建該委託的實例。

定義委託的語法如下:

delegate void IntMethod(int x);

定義了一個委託叫做IntMethod,這個委託可以指向什麼類型的方法呢?我們必須明確,首先這個方法要帶有一個int類型的參數,並且方法的返回值是void的。

定義一個委託要定義方法的參數和返回值,使用關鍵字delegate定義,如下:

delegate double DoubleMethod(double x,double y);
delegate string StringMethod();

注意:如果我們要把方法當做參數來傳遞的話,就要用到委託。簡單來說,委託是一個類型,這個類型可以賦值一個方法的引用。

三、使用委託

  1. 首先,創建一個委託,如下:
// 定義一個返回值爲string的委託類型
private delegate string StringDel();
  1. 在主函數裏,調用這個委託,如下:
int x = 30;
// 使用委託類型,創建實例
StringDel stringDel = new StringDel(x.ToString); // stringDel指向x中的ToString方法
// 通過委託實例(對象)去調用x中的ToString方法
Console.WriteLine(stringDel());
// 查看類型是否轉換成功
Console.WriteLine(stringDel().GetType());

通過上面這個例子,我們可以很清楚的看到,我把ToString()這個方法的引用賦給了這個委託,同時這個委託的返回值是string,此時,我們這個委託就可以實現ToString()這個方法的作用了。

  1. 執行效果
    在這裏插入圖片描述
  2. 總結

在這裏我們首先使用StringDel委託聲明瞭一個類型叫做stringDel,接下來使用new對它進行初始化,使它引用到x中的ToString()方法上,這樣stringDel就相當於x.ToString,我們通過stringDel()執行方法就相當於x.ToString()

  1. 補充

通過上面的委託示例,調用方法還有另一種方法,如下:

// 直接將x的ToString方法的引用,賦給stringDel 
StringDel stringDel = x.ToString;
// 通過Invoke方法調用stringDel所引用的方法
Console.WriteLine(stringDel.Invoke());
Console.WriteLine(stringDel.Invoke().GetType());

注意:通過委託類型去調用一個方法,跟直接調用這個方法作用是一樣的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章