zoukankan      html  css  js  c++  java
  • 泛型与非泛型的区别。

                            泛型集合

    lisit<>
    优点
    1.性能高
        对值类型使用非泛型集合类,在把值类型转换为引用类型,和把引用类型转换为值类型时,需要进行装箱和拆箱的操作。装箱和拆箱的操作很容易实现,但是性能损失较大, 假如使用泛型,就可以避免装箱和拆箱操作。
        此为集合。
     ArrayList list=new ArrayList();
     list.Add(20);    //装箱,list存放的是object类型元素,须将值类型转化为引用类型
     int i=(int)list[0];     //拆箱,list[0]的类型是object,要赋值就得把引用类型转化为值类型
        此为泛型集合。
     List<T> list=new List<int>();
     list.Add(20);    //因为指定了用int来实例化,因此不必装箱
     int i=list[0];    //同样地,访问时也不需要拆箱
    2.类型安全。
        与Arraylist类一样,如果使用对象,可以在这个集合中添加任意类型。如果使用非泛型编程,如下代码,就有可能在某些情况下会发生异常。
        非泛型集合。
     ArrayList list=new ArrayList();
     list.Add(20);
     list.Add("string");
     list.Add(new MyClass());
      foreach(int i in list)
     {
            Console.WriteLine(i);    //这里会有个异常,因为并不是集合中的所有元素都可以转化为int
      }
        如果使用泛型编程,则可以避免这种异常,让编译器检查出错误。
     List<int> list=new List<int>();
     list.Add(20);
     lsit.Add("string");   //编译时报错,只能报整数类型添加到集合中
     list.Add(new MyClass());   //同上
    3.二进制代码重用。
        泛型可以定义一次,用许多种不同的类型实例化,泛型可以在一种语言中定义,在另一种.NET语言中使用。
    4.代码的扩展。
        因为泛型类的定义会放在程序集中,值类型包含在实例化的泛型类的内存中。而每个值类型对内存的要求都不同,所以要为每个值类型实例化一个新类。
            二.特性
    1.默认值。
         在给类型T初始化时,要注意不能把null赋予泛型类型。因为泛型类型也可以实例化为值类型,而null只能用于引用类型。为了解决这个问题,可以用default关键字。通过default关键字,将null赋予引用类型,将0赋予值类型。
     public T GetDoucumet()
     {
            T doc=default(T);
            lock(this)
            {
                  doc=documentQueue.Dequeue();
            }
            return doc;
     }
    2.约束。
        如果泛型类需要调用泛型类型上的方法,就必须添加约束。          注意:使用泛型类型还可以合并多个约束。where T:IFoo,new()约束和MyClass<T>声明指定,类型T必须执行IFoo接口,且必须有一个默认构造函数。
    3.继承。
        泛型类型可以执行泛型接口,也可以派生于一个类。泛型类可以派生于泛型基类:
     public class Base<T>
     {}
     public class Derived<T>:Base<string>
     {}
    要求必须重复接口的泛型类型,或者必须指定基类的类型。
    所以,派生类可以是泛型类或非泛型类。如可以定义一个抽象的泛型基类,它在派生类中用一个具体的类型实现。
    4.静态成员。
        泛型类的静态成员需要特别关注。泛型类的静态成员只能在类的一个实例中共享。
     public class StaticDemo<T>
     {
           public static int x;
     }
    对一个string类型和一个int类型使用了StaticDemo<T>类,所以存在两组静态字段:
     StaticDemo<string>.x=4;
     StaticDemo<int>.x=5;
     Console.WrileLine(StaticDemo<string>.x);    //将会输出4
    总结(泛型的优点与特性):

    性能高,类型安全,二进制代码重用,代码的扩展。

    默认值,继承,约束,静态成员。

  • 相关阅读:
    【发现】visualvm是jdk自带的一款监控工具
    【java】使用jsp命令查看系统中java运行的程序及进程号
    使用软件FileZilla, 通过sftp协议实现windows与linux系统传输文件
    学习spring源码-可参考的资料
    [JS]截取字符,中英文都可以
    ubuntu中在线升级python
    Python中NumPy基础使用
    Web Deploy发布网站一条龙解决方案
    C# lazy<T>的用法
    asp.net 验证正则表达式
  • 原文地址:https://www.cnblogs.com/shigezhuang/p/7373398.html
Copyright © 2011-2022 走看看