俄罗斯贵宾会-俄罗斯贵宾会官网
做最好的网站

装箱拆箱(个人理解)

装箱: 值类型转为引用类型
拆箱: 引用类型转为值类型

C#中的类型都来源于system.object类型,分为值类型和引用类型,分别存在内存的堆栈和托管堆中,值类型一般都是简单类型如int float double等,他们保存在堆栈中,是按后进先出(LIFO)原则存储数据项的一种数据结构。在计算机系统中,栈特指处理器支持的一块内存区域,其中保存着局部变量。工作方式是先分配内存的变量后释放(先进后出原则),所以一旦出了作用域就会被释放,所以在整个项目中无法使用,这个时候就想到了托管堆。

装箱 一般值类型存储自栈中 转为引用类型的时候 要在堆中 申请一个内存 存储变量

堆(托管堆)存储引用类型。此堆非彼堆,.NET中的堆由垃圾收集器自动管理。与堆栈不同,堆是从下往上分配,所以自由的空间都在已用空间的上面。现在来举个例子看看在内存中是如何通过堆栈和托管堆保存数据的。

拆箱 将堆中索引为0的变量 压入到栈中 拆箱指令unbox.any 将引用类型转为值类型 赋给值类型变量

图片 1

图片 2

Int a=100;

那么在堆堆栈中就会分出一块空间用来保存a,值为100,现在有一个方法

Int GetNum(int b)

{

   b=500;

   Return b;

}

这个时候把a的值作为参数传给这个方法,那么此时a的值会不会变成500呢,这个就是我们重点讨论的问题,方式就是一个临时的,用完就会被释放,其实我们只是复制了一个a的到方法里了,所有a的值不会改变

Student stu=new Student();

我们知道上面的是一个引用类型的变量,它在内部的进程是

首先在堆栈中分出一块空间用来放Student stu的引用,然后将new Student()也就是对象stu放到堆中,而她的地址是保存到Student stu的引用中了,如下图

图片 3

所以,如果有方法将引用类型的变量作为参数,就像上面似的,那么她的值会变的,因为它的参数只是一个引用,就比如人是一个引用,通用的熟悉都在人里所包含,假如人的熟悉改变,那么他的具体对象也将改变,下面在来看看自己对装箱和拆箱的理解:

1、装箱和拆箱是一个抽象的概念
2、装箱是将值类型转换为引用类型 ;拆箱是将引用类型转换为值类型

3、为何需要装箱?(为何要将值类型转为引用类型?)
一种最普通的场景是,调用一个含类型为Object的参数的方法,该Object可支持任意为型,以便通用。当你需要将一个值类型(如Int32)传入时,需要装箱。
另一种用法是,一个非泛型的容器,同样是为了保证通用,而将元素类型定义为Object。于是,要将值类型数据加入容器时,需要装箱

4、装箱/拆箱是什么?
装箱:用于在垃圾回收堆中存储值类型。装箱是值类型到 object 类型或到此值类型所实现的任何接口类型的隐式转换。
拆箱:从 object 类型到值类型或从接口类型到实现该接口的值类型的显式转换。

装箱:

本文由俄罗斯贵宾会发布于编程,转载请注明出处:装箱拆箱(个人理解)

您可能还会对下面的文章感兴趣: