C# 通用委托

2018-01-16 02:24 更新

C# 通用委托

委托類(lèi)型可以包含通用類(lèi)型參數(shù)。例如:

public delegate T Converter<T> (T arg);

有了這個(gè)定義,我們可以編寫(xiě)一個(gè)適用于任何類(lèi)型的通用方法:

public class Util {
    public static void Process<T> (T[] values, Converter<T> t) {
       for (int i = 0; i < values.Length; i++)
           values[i] = t (values[i]);
    }
}

class Main {
    static void Main() {
       int[] values = { 1, 2, 3 };
       Util.Process (values, Square); // Hook in Square
       foreach (int i in values){
           Console.Write (i + " "); // 1 4 9
       }
    }
    static int Square (int x) { 
       return x * x; 
    }
}

Func 和 Action委托

使用通用委托,我們可以寫(xiě)一小組委托類(lèi)型來(lái)覆蓋任何返回類(lèi)型和任意數(shù)量的參數(shù)的方法。

這些委托是Func 和Action委托,在系統(tǒng)命名空間中定義:

delegate TResult Func <out TResult> ();
delegate TResult Func <in T, out TResult> (T arg);
delegate TResult Func <in T1, in T2, out TResult> (T1 arg1, T2 arg2);

...等等,直到 T16

delegate void Action ();
delegate void Action <in T> (T arg);
delegate void Action <in T1, in T2> (T1 arg1, T2 arg2);

...等等,直到 T16

這些代表可以覆蓋幾乎所有的方法。


例子

以下代碼顯示了如何使用Func委托,該委托接受T類(lèi)型的單個(gè)參數(shù)并返回相同類(lèi)型的值:

public static void Process<T> (T[] values, Func<T,T> transformer) {
    for (int i = 0; i < values.Length; i++)
        values[i] = transformer (values[i]);
}

這些代理沒(méi)有涉及的唯一實(shí)際場(chǎng)景是ref/out和指針參數(shù)。

代理類(lèi)型彼此不兼容,即使它們的簽名相同。

如果它們以相同的順序引用相同的方法,則多播委托被認(rèn)為是相等的。

以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)