zoukankan      html  css  js  c++  java
  • 泛型

    描述:

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

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

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

    例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
  • 相关阅读:
    HDU2059(龟兔赛跑)
    pat 1012 The Best Rank
    pat 1010 Radix
    pat 1007 Maximum Subsequence Sum
    pat 1005 Sign In and Sign Out
    pat 1005 Spell It Right
    pat 1004 Counting Leaves
    1003 Emergency
    第7章 输入/输出系统
    第六章 总线
  • 原文地址:https://www.cnblogs.com/loveYN/p/4509712.html
Copyright © 2011-2022 走看看