基元类型、引用类型和值类型

基元类型:

 编译器直接支持的类型称为基元类型。基元类型都能映射到Framework类库(FCL)中存在的类型。例如:

 

int  a= 0 ;
System.Int32 a= 0 ;
int  a= new  int ();
System.Int32 a= new  System.Int32();

这四行代码都能正确编译,并生成相同的IL。

 

引用类型和值类型:

       CLR支持两种类型:引用类型值类型。虽然FCL大多数都是引用类型,但我们用得最多的还是值类型。引用类型从托管堆中分配内存,C#使用new关键返回内存地址。使用引用类型,必须考虑以下事情:

1、内存必须从托管堆上分配

2、堆上分配内存的对象都有一些额外的成员,这些成员必须初始化

3、对象的其它字段所需的字节设为零

4、从托管堆上分配的对象,可能强制执行一次内存回收

如果所有的类型都使用引用类型,那么程序的性能将会明显的下降。值类型不受垃圾回收器控制,减少了程序所需的进行垃圾回收的次数。

      所有的值类型都是从System.ValueType直接派生的,System.ValueType本身又是从System.Object派生的。

值类型的装箱和拆箱:

    为了将一个值类型转换成引用类型,就要对值类型进行装箱操作,下面为装箱内部发生的事情:

1、在托管堆中分配内存

2、值类型的字段复制到新分配的堆内存

3、返回对象的地址

下面代码演示了装箱的过程:

 

Int32 a= 5 ;
Object o=a;

首先定义一上值类型,紧接着把a(值类型)赋值给o(引用类型),此处就需要对a进行装箱操作。

     接下来谈谈拆箱。一个已装箱的值类型实例在拆箱时,内部会发生这些事情:

1、如果对已装箱的实例引用为null,就会抛出一个“NullReferenceException”异常。

2、如果要拆箱的对象不是目标值类型的一个实例,就会抛出一个“InvalidCastException”异常。

Int32 x= 4;
Object o=x;
Int16=(Int16)o; 

前部分对Int32类型进行装箱,是没有问题的,后部分将对值类型x的引用拆箱,转成Int16,与原先未装箱时的值类型不配匹,应此,会抛出“InvalidCastException”异常。

 

 以上部分内容参考《CLR Via C#》,欢迎指正以共勉...

转载于:https://www.cnblogs.com/luojianguang/p/3290501.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值