描述:
泛型是具有占位符(類型參數)的類、結構、接口和方法。
泛型集合類可以將類型參數用作它存儲的對象的類型。
泛型方法可以將其類型參數用作其返回值的類型或某個形參的類型。
例1:泛型類定義.
定義一個類Generic,當給予其int類型時,Field字段的類型是int;當給予其string類型時,Field字段的類型是string.
public partial class Default3 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Generic<int> g = new Generic<int>(); g.Field = 1; Generic<string> s = new Generic<string>(); s.Field = "123"; } } public class Generic<T> { public T Field; }
例2:泛型方法定義是具有兩個參數列表的方法:一個泛型類型參數列表和一個形參列表.類型參數可以作為返回類型或形參的類型出現.
public class Generic<T> { public T Field; /// <summary> /// 泛型方法 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="t"></param> /// <returns></returns> public T Ge<T>(T t) { return t; } }
泛型方法可以出現在泛型或者非泛型上.此處要注意的是:
並不是只要方法屬於泛型類型,或者甚至是方法的形參的類型時封閉的泛型參數,就可以說方法是泛型方法.
只有當方法具有它自己的類型參數列表時,才能稱其為泛型方法.
泛型的優點:
1.提高了性能,可以有效的避免裝箱和拆箱.
使用ArrayList:
protected void Page_Load(object sender, EventArgs e) { ArrayList list = new ArrayList(); //執行裝箱操作 list.Add(44); //執行裝箱操作 list.Add(45); foreach (int i in list) { //執行拆箱操作 Response.Write(i.ToString() + "<br/>"); } }
使用泛型:
protected void Page_Load(object sender, EventArgs e) { List<int> list = new List<int>(); //不需要執行裝箱操作 list.Add(44); //不需要執行裝箱操作 list.Add(45); foreach (int i in list) { //不需要執行拆箱操作 Response.Write(i.ToString() + "<br/>"); } }
2.類型安全.如果使用對象Object,則可以添加任意類型,如果泛型中確定為某一類型,則只能對該類型的對象進行操作.
見上例,可以在ArrayList中添加一個字符串,但是不能在List<int>對象中添加字符串.
泛型實例
描述:
比較狗的大小和汽車的大小.其中狗的大小衡量采用年齡,汽車的大小衡量單位是噸位.
因為要實現比較方法,所以兩個類都實現了IComparable<T>接口,該接口定義如下:
namespace System { // 摘要: // 定義由值類型或類實現的通用的比較方法,以為排序實例創建類型特定的比較方法。 public interface IComparable<T> { // 摘要: // 比較當前對象和同一類型的另一對象。 // // 參數: // other: // 與此對象進行比較的對象。 // // 返回結果: // 一個 32 位有符號整數,指示要比較的對象的相對順序。返回值的含義如下: 值 含義 小於零 此對象小於 other 參數。零 此對象等於 other。 // 大於零 此對象大於 other。 int CompareTo(T other); } }狗的定義如下:
public class Dog : IComparable<Dog> { public string Name { get; set; } public int Age { get; set; } public Dog(string name, int age) { this.Name = name; this.Age = age; } public int CompareTo(Dog other) { return this.Age-other.Age; } public override string ToString() { return string.Format("Name:{0} Age:{1}<br/>", this.Name, this.Age); } }汽車的類定義如下:
public class Car : IComparable<Car> { public string Name { get; set; } public int Weight { get; set; } public Car(string name, int weight) { this.Name = name; this.Weight = weight; } public int CompareTo(Car other) { return this.Weight - other.Weight; } public override string ToString() { return string.Format("Name:{0} Weight:{1}<br/>", this.Name, this.Weight); } }
比較類定義如下:
public class Generic { public static T Max<T>(T t1, T t2) { IComparable<T> ic1 = t1 as IComparable<T>; return ic1.CompareTo(t2) > 0 ? t1 : t2; } }
應用:
public partial class Default3 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Dog d1 = new Dog("貝貝", 6); Dog d2 = new Dog("點點", 5); Display<Dog>(Generic.Max<Dog>(d1, d2)); Car c1 = new Car("奔馳", 3); Car c2 = new Car("東風", 10); Display(Generic.Max(c1, c2)); } void Display<T>(T t) { Response.Write(t.ToString()); } }
結果:
Name:貝貝 Age:6 Name:東風 Weight:10