宣告委託型別
以下語法建立名為 NumberInOutDelegate
的 delegate
型別,表示採用 int
並返回 int
的方法。
public delegate int NumberInOutDelegate(int input);
這可以使用如下:
public static class Program
{
static void Main()
{
NumberInOutDelegate square = MathDelegates.Square;
int answer1 = square(4);
Console.WriteLine(answer1); // Will output 16
NumberInOutDelegate cube = MathDelegates.Cube;
int answer2 = cube(4);
Console.WriteLine(answer2); // Will output 64
}
}
public static class MathDelegates
{
static int Square (int x)
{
return x*x;
}
static int Cube (int x)
{
return x*x*x;
}
}
example
委託例項的執行方式與 Square
方法相同。委託例項字面上充當呼叫者的委託:呼叫者呼叫委託,然後委託呼叫目標方法。此間接定址將呼叫者與目標方法分離。
你可以宣告一個通用委託型別,在這種情況下,你可以在某些型別引數中指定該型別是協變(out
)或逆變(in
)。例如:
public delegate TTo Converter<in TFrom, out TTo>(TFrom input);
與其他泛型型別一樣,泛型委託型別可以具有約束,例如 where TFrom : struct, IConvertible where TTo : new()
。
避免用於多播委託的委託型別的共同和逆變,例如事件處理程式型別。這是因為如果執行時型別由於方差而與編譯時型別不同,則連線(+
)可能會失敗。例如,避免:
public delegate void EventHandler<in TEventArgs>(object sender, TEventArgs e);
相反,使用不變的泛型型別:
public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);
還支援代理,其中一些引數由 ref
或 out
修改,如:
public delegate bool TryParser<T>(string input, out T result);
(示例使用 TryParser<decimal> example = decimal.TryParse;
),或最後一個引數具有 params
修飾符的代理。委託型別可以具有可選引數(提供預設值)。委託型別可以在簽名或返回型別中使用指標型別,如 int*
或 char*
(使用 unsafe
關鍵字)。委託型別及其引數可以攜帶自定義屬性。