c#基础之值类型与引用类型

(1)区别

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

所有值类型都可以称之为结构或枚举,使用struct enum修饰,还有int,float,double,char,decimal等。

引用类性一般都是用class,string,object来修饰。

(2)相同点

  1. 值类型和引用类型都是System.Object的子类
  2. 值类型和引用类型都可以继承接口。(很多人都认为值类型不能继承接口)

(----以上引自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个内存,分别存储地址和值。

 

posted @ 2019-05-18 21:05  安静点--  阅读(240)  评论(0编辑  收藏  举报