要在C#中傳遞函數作爲參數,請使用delegate。委託指定傳遞給方法的函數的期望返回類型和參數,並且回調方法必須符合此規範,否則您的代碼將無法編譯。
代表一般都是直接聲明的名稱空間內,並採取以下形式:
<access modifier(s)> delegate <return type> <DelegateName>([argument list]);
例如,在C#名爲FooCallback代表表示爲Foo方法,它沒有參數和返回void回調函數應該是這樣的:
namespace Demo
{
public delegate void FooCallback();
}
一個函數,一個FooCallback參數是這樣的:
namespace Demo
{
//delegate for a FooCallback method from the previous code block
public delegate void FooCallback();
public class Widget
{
public void BeginFoo(FooCallback callback)
{
}
假設您有一個匹配委託簽名的方法,您可以簡單地將它的名稱作爲委託參數的值傳遞。例如,假設你有一個名爲MyFooCallback
功能,您可以把它作爲一個參數傳遞給StartFoo
方法是這樣的:
using Demo; //Needed to access the FooDelegate and Widget class.
namespace YourApp
{
public class WidgetUser
{
private Widget widget; //initialization skipped for brevity.
private void MyFooCallback()
{
//This is our callback method for StartFoo. Note that it has a void return type
//and no parameters, just like the definition of FooCallback. The signature of
//the method you pass as a delegate parameter MUST match the definition of the
//delegate, otherwise you get a compile-time error.
}
public void UseWidget()
{
//Call StartFoo, passing in `MyFooCallback` as the value of the callback parameter.
widget.BeginFoo(MyFooCallback);
}
}
}
雖然可以定義帶有參數的委託,就不可能將參數傳遞列表沿着方法名作爲一個正常調用方法
namespace Demo
{
public delegate void FrobCallback(int frobberID);
//Invalid Syntax - Can't pass in parameters to the delegate method this way.
BeginFrob(MyFrobCallback(10))
}
當委託指定的參數,調用該委託的方法時不採用由代表所需的參數,並把它們傳遞給委託方法被調用時:
然後
BeginFrob(MyFrobCallback, 10)
的BeginFrob方法是,像這樣的10傳入的frobberID值調用MyFrobCallback:
public void BeginFrob(FrobCallback callback, int frobberID)
{
//...do stuff before the callback
callback(frobberID);
}
Lambda Expressions允許你定義一個方法,它是用於而不需要明確聲明它
BeginFoo((int frobberID) => {your callback code here;});
總之,代表是一個裝置,用於將被傳遞方法來加時賽她的方法作爲參數。
完美的,謝謝你的例子。剛剛得到它的工作:) –