C#中的委托類似於C++中的一種特殊的指針:指向函數的指針。通過定義指向函數的指針,在程序中我們就可以靈活的調用多個函數,當然,前提是這些函數的返回類型和參數列表的個數和類型都相同。通過指向函數的指針,我們還可以將函數作為另一個函數的參數。
首先復習一下C++中的指向函數的指針。
1:定義。格式如下:
返回類型 (*指針變量名)(參數類型列表) 注意:參數類型列表中只有參數類型和個數,沒有形參名。
如:
1 double (*fp)(double, double)
2:函數指針的賦值。
格式:指針變量名 = 函數名
注意:函數名所代表的函數,其返回類型和參數列表必須和函數指針的定義中的參數相同。
假如有以下的兩個函數:
double multiple(double p1, double p2)
{
return p1 * p2;
}
double divide(double p1, double p2)
{
return p1 / p2;
}
在程序中就可以將這兩個函數賦給指針fp並且使用了。
如:
fp = multiply;
fp(1.0, 2.0); //等同於調用函數multiply(1.0, 2.0);
fp = divide;
fp(4, 2); //等同於調用函數divide(4, 2);
3:利用函數指針將函數作為另一函數的參數。
因為指向函數的指針就是一個指針變量,所有可以將其作為函數的參數。
如:
void doSomething(double (*fp)(double, double), double p1, double p2)
{
cout << fp(p1, p2) << endl;
}
--------------------------------------------------------------------------------
C#中的委托也是如此。
首先要定義委托類型的變量;
然後要對變量進行賦值;
最後是調用。
1:委托類型的定義:使用關鍵字delegate。
格式:delegate 返回類型 委托類型名(形參列表)
注意:與C++中的函數指針不同,在定義委托類型的形參列表中,除了要給出類型,還有給出形參名。類似於在定義函數原型時,加了個delegate關鍵字。
如:
1 delegate double MyDelegate(double p1, double p2);
注意:此處的MyDelegate並不是一個變量,而是類似於類的一個類型,在使用該委托時還有定義該類型的變量。
2:定義委托類型的變量。
格式:委托類型名 變量名;
3:委托變量的賦值和調用
假如程序中有以下兩個函數:
double Multiply(double p1, double p2)
{
return p1 * p2;
}
double Divide(double p1, double p2)
{
return p1 / p2;
}
有兩種方法可以給委托變量賦值
MyDelegate myDelegate; //定義委托類型的變量
myDelegate = new MyDelegate(Multiply); //賦值方法1
Console.WriteLine(myDelegate(2.0, 3.0)); //委托變量的使用
myDelegate = Divide; //賦值方法2
Console.WriteLine(myDelegate(4, 2));
4:將委托用於函數參數。和C++的函數指針略有不同。
例:
void Test(MyDelegate myDelegate)
{
myDelegate(3, 4);
}