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
  • 相关阅读:
    第七组(69)团队展示
    结对编程作业
    同步异步和阻塞非阻塞
    TCP和UDP和IP和HTTP和socket
    http协议
    数据库基础知识
    准确的笑话
    Java实现多线程的方式
    HashMap
    HTTPS与HTTP
  • 原文地址:https://www.cnblogs.com/oneword/p/1819252.html
Copyright © 2011-2022 走看看