泛型
描述:
泛型是具有占位符(类型参数)的类、结构、接口和方法。
泛型集合类可以将类型参数用作它存储的对象的类型。
泛型方法可以将其类型参数用作其返回值的类型或某个形参的类型。
例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