泛型

描述:

泛型是具有占位符(类型参数)的类、结构、接口和方法。 

泛型集合类可以将类型参数用作它存储的对象的类型

泛型方法可以将其类型参数用作其返回值的类型某个形参的类型

例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
posted @ 2010-09-06 14:49  Localhost  阅读(377)  评论(0编辑  收藏  举报