泛型类和类有什么不同啊

解决方案 »

  1.   

    泛型类也是类,只不过你所要的类不是泛型类。比如说 List<string>这是你要的类,运行时的代码不是在什么 List<T> 上操作,而是在 List<T> 这个类上操作。List<T>顶多算是一种模版而已,并不是真正的最终对象的类型。
      

  2.   

    而是在 List<T> 这个类上操作  -->  而是在 List<string> 这个类上操作如果你不知道 List<string> 是一个类型,而只知道说 List<T> 是一个类型,这可能就是问题的根源。
      

  3.   


    本质的区别在于:普通的类是在编译时,我的类型是确定的。但我们现实中的某些应用场景下可能需要我的对象来根据实际需要去确定它的类型,如下:class A<T>
    {
       public T GetCount()
       {
          //return ToDO
       }
    }实际上编译时并不能确定 GetCount()方法返回的类型,但是我这样用:
    A<int> a=new A<int>();
    这样我就在运行时确定了该类的类型
      

  4.   

    泛型也不能在运行时确定类型的吧,
    t="int"
    A<t> a=new A<t>();
    这样才叫运行时,反射才有运行时的功能
      

  5.   


    我搞错了?!UML里才有泛化的说法,和泛型除了都姓泛以外,没有什么交集吧,
    List<T> 并不继承List,我想我没傻吧
      

  6.   

    这个运行时解释有问题了,(⊙o⊙)…,正解如下,O(∩_∩)O~看下MSDN吧:
    运行时中的泛型(C# 编程指南)泛型类
      

  7.   

    UML?笑话...泛化的概念出现时,计算机还没发明呢,UML的外婆都不知道在谁家呢...只看专业书确实会把人看傻的...
      

  8.   

    唉,我是说泛化目前出现的场景基本上是在说UML的时候,.net里都是说继承。而楼主是说泛型,实在搞不懂不把泛型和泛化混在一起是就是傻的原因!
      

  9.   

    我也来说说自己的一点理解比如List<string>和ArrayList
    ArrayList.add(string)每次都是要生成一个string类型对象,然后加入到ArrayList中
    而List<string>.add(string)加入List<string>时并不知道是string类型对象,是弱类型的,运行时才能确定对象类型
    所以List<string>效率比较高
      

  10.   


    这个和弱类型、运行时扯不上关系的,是装箱拆箱的问题。也没有什么“每次都是要生成一个string类型对象”这种概念,对象要生成早就已经生成了
      

  11.   


    List<string>.add(int) 编译都过不了,根本不用到运行时
    泛型在编译的时候就会产生最终的封闭类型版本,只不过T的实参类型有引用类型与值类型之分罢了
      

  12.   

    泛型还是从c++领域中才能理解的透彻,net环境里的泛型主要为了灵活和性能之间的平衡手段。
      

  13.   

    普通就是放过去会自动转换成object类型!而泛型还是原来的数据类型
      

  14.   

    看到回复,发现分不清泛型和模板的人不少啊,泛型只有一份代码,可以看作只是加了限制了或者自动感知了参数类型,并强制转换返回值类型的一般类,其内部代码的实现和一般的类是没有区别的,还是当作object或者你定义的约束类型来处理的。而C++的模板是多份代码,也就是说vector<int>和vector<double>是有两份独立的代码独立的类!而List<int>和List<double>是同一个类,只是调用它们的方法时最后做的类型转换不同而已。不信你可以typeof一下,你会发现除了FullName外其他都是一样的,甚至包括GUID这个属性都是一样的!二者互有优缺点,一个生成的代码多,但运行效率高,另一个生成较少的代码,但由于装箱和虚调度牺牲了时间。
      

  15.   

    测试代码如下:namespace CSTest
    {
        public class Base
        {
            public Base()
            {        }        public int Get()
            {
                return 0;
            }
        }    public class Extend : Base
        {
            public Extend()
            {        }        public int Get()
            {
                return 1;
            }
        }    public static class Program
        {
            static void Main()
            {
                int Get = Test(new Extend());
                Console.WriteLine(Get);
             }
        
            static int Test<T>(T toGet) where T : Base
            {
                return toGet.Get();
            }
        }
    }输出结果为 0,说明泛型中调用的是基类的函数,也就是说并没有为两种类产生不同的代码。
      

  16.   

    好把,泛型类其实不是类,而是一种“方法”方法的一般概念是,由输入参数得到一个输出参数,输入的是变量,输出的也是变量

    FUN(a,b,c,d)而泛型这种“方法”,输入参数是类型,输出的也是类型
    TYPE<a,b,c,d>
      

  17.   


    这个和泛型方法关系不大吧,是因为你的Get相当于new,如果加上override,就是返回1了
      

  18.   

    35L的朋友:
    我想说明的是泛型和模板的区别,如果用虚函数的话,那么一份代码就可以有不同的行为,在C++中模板是不会管你是不是虚函数的,就算非虚函数,由于一个类型一份代码,其结果也是不同的,所以用虚函数来证明模板与泛型的不同毫无意义。
    另外说明一下,为什么C#使用泛型而不是模板,道理很简单,熟悉C++的朋友都知道模板库,比如STL,Boost,MTL,ATL,WTL等等都是源码库,而不是二进制库,原因很简单,因为代码必须在编译时填入类型才会生成。而C#是基于二进制动态连接库的,在这样的系统中实现模板是不可能的。