什麼是委託
可以認為委託是持有乙個或多個方法的物件。
下面我們講提供建立和使用委託的語法和語義。在後面你將看到如何使用委託將可執行的**從乙個方法傳遞到另乙個,以及為什麼這樣做是非常有用的。
我們將從下面的示例**開始。如果此時你有些東西弄不明白,不必擔心,我會在本章剩餘內容中介紹委託的細節。
**開始部分宣告了乙個委託型別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...