C 委託方法

2021-10-07 19:29:42 字數 3186 閱讀 3686

什麼是委託

可以認為委託是持有乙個或多個方法的物件。

下面我們講提供建立和使用委託的語法和語義。在後面你將看到如何使用委託將可執行的**從乙個方法傳遞到另乙個,以及為什麼這樣做是非常有用的。

我們將從下面的示例**開始。如果此時你有些東西弄不明白,不必擔心,我會在本章剩餘內容中介紹委託的細節。

**開始部分宣告了乙個委託型別mydel

program類宣告了3個方法:printlow、printhigh和main。接下來要建立的委託物件將持有printlow或printhigh方法,但到底使用哪個要到執行時才能確定。

main宣告了乙個區域性變數del,將持有乙個mydel型別的委託物件的引用。這並不會建立物件,只是建立持有委託物件引用的變數,在幾行之後便會建立這個委託物件,並將其賦值給這個變數。

main建立了乙個random類的物件,這是乙個隨機數生成器類。接著程式呼叫該物件的next方法,將99作為方法的輸入引數。這會返回介於0到99之間的隨機整數,並將這個值儲存在區域性變數randomvalue中。

下面一行檢查這個返回並儲存的隨機值是否小於50(注意,我們使用三元條件運算子來返回兩個委託之一。)

如果該值小於50,就建立乙個mydel委託物件並初始化,讓它持有printlow方法的引用。

否則,就建立乙個持有printhigh方法的引用的mydel委託物件。

最後,main執行委託物件del,這將執行它持有的方法(printlow或printhight)。

delegate void mydel(int value);   //宣告委託型別

class program - low value", value );

}void printhigh( int value )

- high value", value );

}static void main( )

}

由於我們使用了隨機數生成器,程式在不同的執行過程中會產生不同的值。某次執行可能產生的結果如下:

38 - low value
委託概述

委託和類一樣,是一種使用者自定義的型別。但類表示的是資料和方法的集合,而委託則持有乙個或多個方法,以及一些列預定義操作。可以通過以下操作步驟來使用委託,我們將在之後的內容中逐個解釋每步操作。

(1) 宣告乙個委託型別。委託宣告看上去和方法宣告相似,只是沒有實現。

(2) 使用該委託型別宣告乙個委託變數。

(3) 建立委託型別的物件,把它賦值給委託變數。新的委託物件包括指向某個方法的引用,這個方法和第一步定義的簽名和返回型別一致。

(4) 你可以選擇為委託物件增加其他方法。這些方法必須與第一步中定義的委託型別有相同的簽名和返回型別。

(5) 在**中你可以像呼叫方法一樣呼叫委託。在呼叫委託的時候,其包含的每乙個方法都會被執行。

委託的宣告

正如我上節所述,委託是型別,就好像類是型別一樣。與類一樣,委託型別必須在被用來建立變數以及型別的物件之前宣告。如下示例**宣告了委託型別。

delegate void mydel( int x );
建立委託物件

委託是引用型別,因此有引用和物件。在委託型別宣告之後,我們可以宣告變數並建立型別的物件。如下**演示了委託型別的變數宣告:

mydel  delvar;//建立委託物件

delvar = new mydel( myinstobj.mym1 ); //方法一 用new進行初始化

delvar = myinstobj.mym1; //方法二 直接賦值

組合委託

委託可以使用額外的運算子來「組合」。這個運算最終會建立乙個新的委託,其呼叫列表連線了作為運算元的兩個委託的呼叫列表副本。

例如,如下**建立了3個委託。第3個委託由前兩個委託組合而成。

mydel dela = myinstobj.mym1;mydel delb = sclass.otherm2;

mydel delc = dela + delb; //組合呼叫列表

為委託新增方法

mydel delvar  = inst.mym1;     //建立並初始化

delvar += scl.m3; //增加方法

delvar += x.act; //增加方法

從委託移除方法

delvar -= scl.m3;             //從委託移除方法
委託的示例

如下**定義並使用了沒有引數和返回值的委託。有關**的注意事項如下。

//定義乙個沒有返回值和引數的委託型別delegate void printfunction();

class test

public static void print2()

}class program}

輸出:

print1 -- instance

print2 -- staticprint1 -- instance

print2 – static

呼叫帶返回值的委託

delegate int mydel( );                 //宣告有返回值的方法class myclass 

public int add3() }

class program ", mdel() );

}}

輸出:

value: 12
呼叫帶引用引數的委託

delegate void mydel( ref int x );

class myclass

public void add3(ref int x)

static void main()

", x);

}}

輸出:

value: 12
匿名方法

委託型別的返回型別

delegate int otherdel(int inparam);

static void main();

}

C 委託 使用匿名方法

使用c 委託還有另一種重要方法 通過匿名方法。其中,匿名方法是用作委託引數的乙個 塊。請看下面的例子 匿名方法的作用是使 更簡化,方便了程式設計師。如果沒有匿名方法,則定義一套事件監聽需要這樣 class program 一般來說,定義的myeventhandler方法只用來響應事件,只在上面那一處...

C 委託 使用匿名方法

使用c 委託還有另一種重要方法 通過匿名方法。其中,匿名方法是用作委託引數的乙個 塊。請看下面的例子 匿名方法的作用是使 更簡化,方便了程式設計師。如果沒有匿名方法,則定義一套事件監聽需要這樣 class program 一般來說,定義的myeventhandler方法只用來響應事件,只在上面那一處...

C 委託四 匿名方法

什麼是匿名方法?匿名方法是c 2.0引入的乙個新特性,它允許開發者宣告自己的函式 而無須使用委託函式。c 為委託提供一種機制,可以為委託定義匿名方法,匿名方法沒有名稱,編譯器會定指定乙個名稱,匿名方法中不能使用跳轉語句跳轉到該匿名方法的外部,也不能跳轉到該方法的內部。也不能在匿名方法外部使用的ref...