深刻解析C#編程中泛型拜托的應用。本站提示廣大學習愛好者:(深刻解析C#編程中泛型拜托的應用)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻解析C#編程中泛型拜托的應用正文
在看泛型拜托之前還須要先懂得拜托的概念。
這裡講的拜托有兩品種型一種是有前往值的,另外一種是事宜拜托。
//界說有前往值的拜托 public delegate string GenricDelegate<T, S>(T title, S author); //界說事宜拜托。 public delegate void GenricDelegateEnent<E,P>(E Name,P Address); public class GenericDelegateClass<V,F> { //聲明拜托 public GenricDelegate<V, F> GdeleValue; //聲明事宜拜托 public event GenricDelegateEnent<V, F> GdEvent = null; public string GetValues(V title, F author) { //挪用拜托 return GdeleValue(title, author); } public GenericDelegateClass() { } public void InvokeEvent(V name, F address) { if (GdEvent != null) { //挪用拜托 GdEvent(name, address); } } }
下面我們界說及挪用了泛型拜托,接上去就來梆定拜托。
private void btnDelegate_Click(object sender, EventArgs e) { GenericDelegateClass<string, string> gd = new GenericDelegateClass<string, string>(); //將DelegateReturn事宜梆定給GdeleValue gd.GdeleValue = new GenricDelegate<string, string>(DelegateReturn); //將GenericEvent事宜梆定給GdEvent gd.GdEvent += new GenricDelegateEnent<string, string>(GenericEvent<string,string>); } public string DelegateReturn<T,S>(T title,S author) { return title.ToString() + author; } private void GenericEvent<V, F>(V name, F address) { // }
在這裡我們看到我在梆定DelegateReturn的時刻並沒有帶泛型參數。在這裡的泛型參數實際上是沒甚麼意義的。由於他的類型取決於挪用拜托的辦法的類型。也就是在後面那段代碼中InvokeEvent辦法的類型,這裡的DelegateReturn要用泛型辦法是可以隨時跟InvokeEvent的參數類型堅持一至。如許梆定後我們再來挪用gd.GetValues("my generic post","fastyou");如許挪用的其實就是DelegateReturn的辦法,這就是拜托的利益了,異樣挪用gd.InvokeEvent("my generic post","fastyou");就是GenericEvent辦法。
拜托 可以界說本身的類型參數。援用泛型拜托的代碼可以指定類型參數以創立已封閉的結構類型,就像實例化泛型類或挪用泛型辦法一樣,以下例所示:
public delegate void Del<T>(T item); public static void Notify(int i) { } Del<int> m1 = new Del<int>(Notify);
C# 2.0 版具有稱為辦法組轉換的新功效,此功效實用於詳細拜托類型和泛型拜托類型,並使您可使用以下簡化的語法寫入上一行:
Del<int> m2 = Notify;
在泛型類外部界說的拜托應用泛型類類型參數的方法可以與類辦法所應用的方法雷同。
class Stack<T> { T[] items; int index; public delegate void StackDelegate(T[] items); }
援用拜托的代碼必需指定包括類的類型變量,以下所示:
private static void DoWork(float[] items) { } public static void TestStack() { Stack<float> s = new Stack<float>(); Stack<float>.StackDelegate d = DoWork; }
依據典范設計形式界說事宜時,泛型拜托特別有效,由於發送方參數可認為強類型,不再須要強迫轉換成 Object,或反向強迫轉換。
delegate void StackEventHandler<T, U>(T sender, U eventArgs); class Stack<T> { public class StackEventArgs : System.EventArgs { } public event StackEventHandler<Stack<T>, StackEventArgs> stackEvent; protected virtual void OnStackChanged(StackEventArgs a) { stackEvent(this, a); } } class SampleClass { public void HandleStackChange<T>(Stack<T> stack, Stack<T>.StackEventArgs args) { } } public static void Test() { Stack<double> s = new Stack<double>(); SampleClass o = new SampleClass(); s.stackEvent += o.HandleStackChange; }