宣告委託型別

以下語法建立名為 NumberInOutDelegatedelegate 型別,表示採用 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);

還支援代理,其中一些引數由 refout 修改,如:

public delegate bool TryParser<T>(string input, out T result);

(示例使用 TryParser<decimal> example = decimal.TryParse;),或最後一個引數具有 params 修飾符的代理。委託型別可以具有可選引數(提供預設值)。委託型別可以在簽名或返回型別中使用指標型別,如 int*char*(使用 unsafe 關鍵字)。委託型別及其引數可以攜帶自定義屬性。