泛型的好處:類型安全性能高,代碼重用擴展好。 泛型的使用:如果我們需要使用多個泛型來實例化一個類型,那麼我們就需要使用說明性的名稱,比如TId,TFirstName之類的。 泛型的約束: where T : struct -類型T必須是值類型 where T : class -類型T必須是引用類型 ...
泛型的好處:類型安全性能高,代碼重用擴展好。
泛型的使用:如果我們需要使用多個泛型來實例化一個類型,那麼我們就需要使用說明性的名稱,比如TId,TFirstName之類的。
泛型的約束:
where T : struct -類型T必須是值類型
where T : class -類型T必須是引用類型
where T : Ifoo -類型T必須執行介面Ifoo
where T : foo -類型T必須繼承自 foo
where T : new() -類型T必須有一個預設構造函數
where T : U -指定泛型類型T1派生於T2。即多個泛型類型之間有繼承關係
泛型繼承:類可以繼承自泛型基類,泛型類也可以繼承自泛型基類。有一個限制,在繼承的時候,必須顯示指定基類的泛型類型,型如:public class Child<T>:Base<int>{…}
泛型介面:需要註意的是,在實現介面時需要指定介面的泛型類型。
泛型方法:跟泛型類差不多,方法在定義的時候使用泛型類型定義參數。調用的時候使用實際類型替換。
泛型委托:如果我們需要定義的只是一個功能,但是功能的實現要到具體的地方纔能確定,我們就可以使用委托,但是使用委托我們的方法返回值和參數類型就確定了,我們可以讓委托具有更高等級的抽象,返回值,參數類型都到具體的地方制定。這裡的具體地方就是我們要實現的方法。這樣,我們的委托就具有更高級別的抽象。我們設計的類就具有更高級別的可以用性,我們只需要實現方法的細節就可以了。方法的細節怎麼實現,可以使用匿名方法,或者lamda表達式。
這裡舉一個自動算工資的例子來講一下泛型委托。先定義一個員工類SalaryPerson,裡面包含了一個薪資累加的方法:
1 public class SalaryPerson 2 { 3 private int _id; 4 5 public int Id 6 { 7 get { return _id; } 8 set { _id = value; } 9 } 10 11 private string _name; 12 13 public string Name 14 { 15 get { return _name; } 16 set { _name = value; } 17 } 18 19 private decimal _salary; 20 21 public decimal Salary 22 { 23 get { return _salary; } 24 set { _salary = value; } 25 } 26 27 public SalaryPerson() { } 28 29 public SalaryPerson(int id, string name, decimal salry) 30 { 31 this._id = id; 32 this._name = name; 33 this._salary = salry; 34 } 35 36 /// <summary> 37 /// 薪資累加 38 /// </summary> 39 /// <param name="p"></param> 40 /// <param name="d"></param> 41 /// <returns></returns> 42 public static decimal AddSalary(SalaryPerson p, decimal d) 43 { 44 d += p.Salary; 45 return d; 46 } 47 }View Code
定義泛型委托類GenericDelegate:
1 public class GenericDelegate 2 { 3 //定義泛型委托 4 public delegate TResult Action<TInput, TResult>(TInput input, TResult result); 5 6 public static TResult GetSalary<TInput, TResult>(IEnumerable<TInput> e, Action<TInput, TResult> action) 7 { 8 TResult result = default(TResult); 9 10 foreach (TInput t in e) 11 { 12 result = action(t, result); 13 } 14 15 return result; 16 } 17 }
調用代碼:
1 List<SalaryPerson> list = new List<SalaryPerson>(); 2 list.Add(new SalaryPerson(1, "Edrick", 5000)); 3 list.Add(new SalaryPerson(1, "Meci", 3000)); 4 list.Add(new SalaryPerson(1, "Jun", 1000)); 5 6 //GenericAndDelegate.Action<SalaryPerson, Decimal> a = new GenericAndDelegate.Action<SalaryPerson, Decimal>((m, n) => n += m.Salary); 7 GenericDelegate.Action<SalaryPerson, Decimal> a = delegate (SalaryPerson sp, decimal s) { return s += sp.Salary; }; 8 //等同於 list.ForEach(m => d += m.Salary); 9 decimal d = GenericDelegate.GetSalary<SalaryPerson, Decimal>(list, a); 10 Console.WriteLine(d); 11 Console.Read();
參考資料:.net中的泛型全面解析