引用类型在内存中是分配在堆上,其类型本身的最大长度是可变的。如:sting,class,...
值类型在内存中是分配在堆栈上,其类型本身的最大长度是固定的。如:int,boolean,...

解决方案 »

  1.   

    引用类型在HEAP上,需要GC来进行回收
    而值类型在STACK上,不需要GC回收,因为遵从后进先出的原则,性能更优,因为调用GC对性能有所影响。
    C#对CLASS和STRUCT分别定为引用类型和值类型,就是为了在处理对象方面保留性能的选择给用户
      

  2.   

    变量类型在分配给它们的内存中保持数据。因为每个变量类型的实例是独立的,并且不能被一个以上变量访问,所以变量类型可以在堆栈(stack)中保持和管理。引用类型只保持指向存储数据的内存的指针。因为有一个以上变量能执行该数据,因此引用类型必须在堆(heap)中保持和管理。 堆的管理比执行堆栈分配困难。它的总开销包括堆分配、对象访问、无用信息收集(garbage collection,GC)。这意味着当不需要引用类型的灵活性时,较小的值类型(value type)是比引用类型好的选择。但是当值类型变大时就没有这个好处了。例如,分配一个5个字节的值类型就比分配一个引用类型花费的时间长。 采用较小的值类型将把性能提高30%左右。注意它也依赖其它的因素,例如硬件平台、系统载入和数据大小等。 
      

  3.   

    同意 huangsuipeng(hsp-ec.net)的.
    跟GC回收有关。
      

  4.   

    我在一个结构类型中定义了一个应用类型字段。定义两个此结构得实例后,将其中一个实例赋值给另外一个结构体实例。如果是值类型的话,这两个实例应该是独立的。但是我将第二个结构体实例的引用型字段修改值后,第一个结构体实例的相应字段的值也变化了。
    class cls{
        public Int32 m;
    }
    struct str{
         cls mycls;
    }
    main()
    {
      str struc1,struc2;
      struc1.mycls.m=10;
      struc2=struc1;
      struc2.mycls.m=20;//结果struc1的mycls.m的值也变化了,这如何理解结构类型是值类型呢?}