c#基础系列之值类型和引用类型的深入理解

2020-01-05 09:22:38丽君

值类型

因为引用类型变量都需要进行一次堆内存的分配,这会给GC造成很大的压力,所以CLR提供了轻量级类型“值类型”。 值类型一般在线程栈上分配。(注意:值类型可以嵌入一个引用对象中)一个值类型变量其实就包含了值类型实例的值,所以它没有引用类型的指针(大家猜想值类型需不需要类型对象指针呢?)

相同点和不同点

相同点

  • 值类型和引用类型都是System.Object的子类
  • 值类型和引用类型都可以继承接口。(很多人都认为值类型不能继承接口)
    
     interface Itest
     {
     void test();
     }
     struct TestStruct : Itest
     {
     public void test()
     {
     throw new NotImplementedException();
     }
     }

    不同点

    • 值类型分配在堆栈上,引用类型是在托管堆上分配的。这里需要指出一点:如果一个引用类型中的某个属性是值类型,这个值类型的属性是分配在托管堆上的。
    • 所有的值类型都是隐式密封的(sealed),例如 :你不可能继承int 来构造自己的类型。
    • 值类型的每一次赋值都会执行一次逐字段的复制,所以如果是频繁赋值也会造成性能上的压力,引用类型的赋值只是指针的传递,其实也是生成新的指针实例。
    • 引用类型额外有类型对象指针和同步块索引,值类型是没有的。所以我们平时使用lock 锁的对象不可能是值类型,因为值类型没有同步块索引