java 引用类型和值类型的区别_值类型和引用类型的区别

本文详细解析了C#中的装箱和拆箱操作。在C#中,值类型变量如int默认会被赋值为0。当值类型转换为引用类型时,发生装箱,会在堆上分配空间并拷贝值;拆箱则是从引用类型获取值类型的过程。如果尝试拆箱一个空引用,程序会抛出异常。理解装箱和拆箱对于高效使用C#至关重要。
摘要由CSDN通过智能技术生成

声明一个值类型变量,编译器会在栈上分配一个空间,这个空间对应着该值类型变量,空间里存储的就是该变量的值。

引用类型的实力分配在堆上,新建一个引用类型实例,得到的变量对应的是该实例的内存分配地址,这就像您的银行账号一样。

1: public static class BoxingAndUnboxing

2: {

3: public static void Demonstration()

4: {

5: int ageInt = new int();

6:

7: // Boxing operation.

8: object ageObject = ageInt;

9:

10: //ageObject = null;

11:

12: // Unboxing operation.

13: ageInt = (int)ageObject;

14:

15: Console.WriteLine(ageInt);

16: }

17: }

在该方法中,我们首先声明了一个值类型变量ageint,但并未给它赋值,接着声明了一个典型的引用类型变量ageobject,并把ageint赋给它,这里就进行了一次装箱操作。编译器现在托管堆上分配一块内存空间(空间大小为对象中包含的值类型变量所占空间总和外加一个方法表指针和一个syncblockindex),然后把ageint拷贝到这个空间中,再返回该空间的引用地址,接下来第13行是拆箱操作,编译器获取到ageobject对象中值类型变量的指针,然后将其值拷贝给值类型变量。如果你把第10行的代码打开,程序不会报错,最后打印出个0,这说明在声明值类型变量时,如果没有初始化赋值,编译器会自动将其赋值为0,既然值类型没有引用,那么它就不可能为空。引用类型不一样,它可以为空引用,一张过期作废的银行卡可以存在。而如果将一个空的对象装箱,编译器上哪儿区找它里面的值类型变量的指针呢?所以这也是拆箱操作需要注意的地方。

未装箱的值类型分配在栈上而不是堆上,而栈又不是GC的地盘儿,因此GC根本不过问值类型变量的死活,一旦值类型变量的作用范围一过,它所占的空间就立即被回收掉,不劳GC亲自动手。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值