(1)区别
- 值类型分配在堆栈上,引用类型是在托管堆上分配的。这里需要指出一点:如果一个引用类型中的某个属性是值类型,这个值类型的属性是分配在托管堆上的。
- 所有的值类型都是隐式密封的(sealed),例如 :你不可能继承int 来构造自己的类型。
- 值类型的每一次赋值都会执行一次逐字段的复制,所以如果是频繁赋值也会造成性能上的压力,引用类型的赋值只是指针的传递,其实也是生成新的指针实例。
- 引用类型额外有类型对象指针和同步块索引,值类型是没有的。所以我们平时使用lock 锁的对象不可能是值类型,因为值类型没有同步块索引
(2)相同点
- 值类型和引用类型都是System.Object的子类
-
值类型和引用类型都可以继承接口。(很多人都认为值类型不能继承接口)
(----以上引自http://www.cnblogs.com/zhanlang/p/9603592.html)
(3)值类型 --分为简单值类型和复合值类型--它们统一继承 System.ValueType。
值类型是在栈中分配内存,在声明时初始化才能使用,不能为null。
值类型超出作用范围系统自动释放内存。
1.简单值类型:整型:Int;长整型:long;浮点型:float;字符型:char;布尔型:bool
2.复合值类型(里面可以定义更小值类型):struct,enum等。注意:struc结构和class类除了在关键字上不同其他结构是一样的。在用法上深入这里不探讨。
3.范围
int占4个字节32位,long占8个字节64位
1byte(字节)=8bit(位)
在c#中需要注意:
Int16 = short, 占2个字节. -32768 ~ 32767
Int32 = int, 占4个字节. -2147483648 ~ 2147483647
Int64 = long, 占8个字节. -9223372036854775808 ~ 9223372036854775807
以int32为例:
int32是有符号的,所以Int32的最大数并不是42,9496,7296,而是(2^31)-1=+21,4748,3647,为什么是31次方,因为是有符号整型,最高位要空出来判断是不是负数,所以是31次方,-1是因为0占了一个数。
但是一共还是能存储2^32次方 既42,9496,7296个数,因为有正负数,其实一样的,还是2的32次方个数
UInt32和Int32一样 ,也是代表一共能存储2^32次方,一共有42,9496,7296个数
但是因为只有正数和0,所以最大值为4364967295, 既2^32-1,-1是因为0占了一个数。
(4)引用类型----有数组,用户定义的类、接口、委托,object,字符串等。
引用类型在堆中分配内存,初始化时默认为null。
引用类型是通过垃圾回收机制进行回收。
DemoClass d=new DemoClass(); d1=new DemoClass(); d1=d; d1.Age=10; 则d1与d的Age都是10
具体原因如下:
每定义一个值类性只是创建一个内存,存储值,引用类性则是创建2个内存,分别存储地址和值。
---本人菜鸟,只是从菜鸟的角度来理解,不涉及更深层次,欢迎提点。
来源:https://www.cnblogs.com/anjingdian/p/10887086.html