在上一篇文章中,您看到您可以使用 delegate 關鍵詞來建立特定的委派類型。
抽象委派類別提供鬆散結合和調用的基礎結構。 具體委派類型藉由確保加入委派物件的調用清單中的方法類型安全性,變得更加有用。 當您使用 delegate 關鍵詞並定義具體的委派類型時,編譯程式會產生這些方法。
實際上,每當您需要不同的方法簽名時,這會導致建立新的委派類型。 這項工作可能會在一段時間後變得乏味。 每個新功能都需要新的委派類型。
謝天謝地,這不是必要的。 .NET Core 架構包含數種類型,您可以在需要委派類型時重複使用。 這些是 泛型 定義,因此當您需要新的方法宣告時,您可以進行自訂化宣告。
這些類型的第一個是 Action 類型,以及數種變化:
public delegate void Action();
public delegate void Action<in T>(T arg);
public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);
// Other variations removed for brevity.
泛型型別in引數上的修飾詞涵蓋在協變性的一文中。
委派有最多16個 Action 自變數的變化,例如 Action<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16>。
重要的是,這些定義會針對每個委派自變數使用不同的泛型自變數:這可提供最大的彈性。 方法參數不需要是相同的類型,但可能是。
針對任何具有 void 傳回型別的委派類型,使用其中一個 Action 類型。
架構也包含數種泛型委派類型,您可以用於需要傳回值的委派類型:
public delegate TResult Func<out TResult>();
public delegate TResult Func<in T1, out TResult>(T1 arg);
public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);
// Other variations removed for brevity
out結果泛型型別自變數上的修飾詞涵蓋在共變數一文中。
委派有最多 16 個 Func 輸入自變數的變化,例如 Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,TResult>。
依慣例,結果的類型一律是所有 Func 宣告中的最後一個類型參數。
針對傳回值的任何委派類型,使用其中一個 Func 型別。
委派也有專用 Predicate<T> 類型,能針對單一值返回測試結果。
public delegate bool Predicate<in T>(T obj);
您可能會注意到,針對任何 Predicate 類型,結構上對等 Func 的類型存在 例如:
Func<string, bool> TestForString;
Predicate<string> AnotherTestForString;
您可能會認為這兩種類型相等。 他們不是。 這兩個變數無法交替使用。 無法將某個類型的變數指派給另一種類型。 C# 類型系統會使用已定義型別的名稱,而不是結構。
.NET Core 連結庫中的所有這些委派類型定義都應該表示,您不需要為任何需要委派的新功能定義新的委派類型。 這些泛型定義應該提供您在大部分情況下所需的所有委派類型。 您可以直接具現化其中一個具有必要類型參數的型別。 在可做為泛型的演算法案例中,這些委派可以當做泛型型別使用。
這應該可節省時間,並將您需要建立的新類型數目降到最低,以便使用委派。
在下一篇文章中,您將會看到實際操作委派的幾種常見模式。