什麼是委托
首先要知道什麼是委托用最通俗易懂的話來講你就可以把委托看成是用來執行方法(函數)的一個東西
如何使用委托
在使用委托的時候你可以像對待一個類一樣對待它即先聲明再實例化只是有點不同類在實例化之後叫對象或實例但委托在實例化後仍叫委托
聲明如
namespace VczxProCSharpExc
{
delegate double MathsOp( double x )
//class defination here
}
這就聲明了一個委托意義任何一個返回值為double且只有一個形參為double的函數都可以用這個委托來調用
注意委托的聲明位置在namespace裡面類的外面其實委托的聲明也可以在類的裡面甚至是任何一個可以聲明類的地方
實例化
首先我們要先有一個滿足委托聲明的方法假設一個返回一個數的倍的方法
class MathsOperations
{
public static double MultiplyBy( double value )
{
return value *
}
}
有了這樣一個方法我們就可以實例化一個委托了
MathsOp operation = new MathsOp( MathsOperationsMultiplyBy )
在實例化一個委托時要給它一個參數這個參數就是委托執行的方法它可以是靜態方法也可以是實例方法(這一點有別於函數指針函數指針只能調用靜態方法)如
MathsOp operation = new MathsOp( new Class()Method )
在實例化完一個委托之後就可以用這個委托來調用方法了
double result = operation( )
例子代碼
namespace VczxProCSharpExc
{
delegate double MathsOp( double x )
class Start
{
public class MyDelegate
{
public static double MultiplyBy( double x )
{
return x *
}
}
[STAThread]
static void Main(string[] args)
{
MathsOp operation = new MathsOp( MyDelegateMultiplyBy )
double x =
double result = operation( x )
ConsoleWriteLine( {} multiply by is {} x result )
ConsoleRead()
}
}
}
多路廣播委托
前面使用的委托只包含一個方法調用調用委托的次數與調用方法的次數相同如果要調用多個方法就需要多次顯示調用這個委托其實委托也可以包含多個方法這種委托就是多路廣播委托多路廣播委托派生於SystemMulticastDelegate它的Combine方法允許把多個方法調用鏈接在一起我們可以通過+=來向委托添加調用方法也可以用=刪除其中的調用方法如
namespace VczxProCSharpExc
{
public class MyDelegate
{
public static void MultiplyBy( double value )
{
double result = value *
ConsoleWriteLine( Multiplying by {} gives {} value result )
}
public static void Squre( double value )
{
double result = value * value
ConsoleWriteLine( Squaring {} gives {} value result )
}
}
delegate void MathsOp( double x )
class Start
{
[STAThread]
static void Main(string[] args)
{
MathsOp operation = new MathsOp( MyDelegateMultiplyBy )
operation += new MathsOp( MyDelegateSqure )
double x =
operation( x )
operation = new MathsOp( MyDelegateMultiplyBy )
operation( x )
ConsoleRead()
}
}
}
輸出
Multiplying by gives
Squaring gives
Squaring gives
注意多路廣播委托聲明時必須返回void否則返回值不知道應該送回什麼地方對此我做了一個測試如果不將委托的聲明返回void則返回值返回的是最後一個鏈入委托鏈的方法的返回值編譯不會出錯
為什麼要用委托
使用委托使程序員可以將方法引用封裝在委托對象內然後可以將該委托對象傳遞給可調用所引用方法的代碼而不必在編譯時知道將調用哪個方法與C或C++中的函數指針不同委托是面向對象而且是類型安全的
From:http://tw.wingwit.com/Article/program/net/201311/11900.html