泛型學習筆記

泛型的好處:類型安全性能高,代碼重用擴展好。html

泛型的使用:若是咱們須要使用多個泛型來實例化一個類型,那麼咱們就須要使用說明性的名稱,好比TId,TFirstName之類的。安全

泛型的約束ide

  where T : struct -類型T必須是值類型函數

  where T : class -類型T必須是引用類型性能

  where T : Ifoo -類型T必須執行接口Ifoothis

  where T : foo -類型T必須繼承自 foospa

  where T : new() -類型T必須有一個默認構造函數.net

  where T : U -指定泛型類型T1派生於T2。即多個泛型類型之間有繼承關係設計

泛型繼承:類能夠繼承自泛型基類,泛型類也能夠繼承自泛型基類。有一個限制,在繼承的時候,必須顯示指定基類的泛型類型,型如:public class Child<T>:Base<int>{…}code

泛型接口:須要注意的是,在實現接口時須要指定接口的泛型類型。

泛型方法:跟泛型類差很少,方法在定義的時候使用泛型類型定義參數。調用的時候使用實際類型替換。

泛型委託:若是咱們須要定義的只是一個功能,可是功能的實現要到具體的地方纔能肯定,咱們就能夠使用委託,可是使用委託咱們的方法返回值和參數類型就肯定了,咱們能夠讓委託具備更高等級的抽象,返回值,參數類型都到具體的地方制定。這裏的具體地方就是咱們要實現的方法。這樣,咱們的委託就具備更高級別的抽象。咱們設計的類就具備更高級別的能夠用性,咱們只須要實現方法的細節就能夠了。方法的細節怎麼實現,能夠使用匿名方法,或者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中的泛型全面解析

相關文章
相關標籤/搜索