搜索
首页后端开发C#.Net教程轻松学习C#的装箱与拆箱

首先看一看什么是装箱和拆箱?
       简单的来说:
       装箱就是值类型转换为引用类型;
       拆箱就是引用类型转换为值类型。
       值类型,包括原类型(Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、Float、Double、Bool、Decimal)、枚举 (enum) 、结构 (struct)。
       引用类型包括类、数组、接口、委托、字符串等。

装箱:值类型到引用类型或到此值类型所实现的任何接口类型的隐式转换
       例如: int temp = 3;
                System.Object obj = temp;
       其中,temp为值类型,在栈中分配;当分配obj这个引用类型时,我们需要在堆中分配一个obj对象,然后把temp值赋给它,这么一系列的过程就是装箱的过程。

拆箱:从引用类型到任意值类型的显式转换。与装箱不同,拆箱式显示转换。
       例如:int temp = 3;
                 System.Object obj = temp;
                  int i = (int) obj;
       拆箱过程中,首先来确定对象obj为一个值类型的装箱值,然后把值赋给值类型。
隐式转换总会成功的情况,不会抛出异常:
  (1)、从派生类到基类;
  (2)、从派生接口到基接口;
  (3)、从类到接口(该类实现了接口);
  (4)、从Null到任何类;
显式引用转换,以下可能抛出异常,转换不一定成功:
  (1)、从基类到派生类;
  (2)、从接口到接口(基接口到派生接口或者俩接口没有关系);
  (3)、从接口到类(该类实现了该接口或该类未封闭);
  (4)、从类到接口(该类未实现该接口且该类未封闭);

上面简单的介绍了拆箱和装箱的定义,下面就来讨论一下装箱和拆箱与堆和栈怎样使用
       其中值类型是在栈中分配内存,本身的声明就是一个初始化的过程,其不需要进行垃圾回收,只要超出所定义的作用范围会自动释放内存,而引用类型则是在堆中分配的,和java一样,在堆种分配内存,而其托管堆进行垃圾回收。当两种数据类型进行转换时就引出了装箱/拆箱。
比较装箱和拆箱的优缺点
       装箱和拆箱虽然满足了两只类型之间的转换。但是从装箱的过程中不难看出,每次装箱时要在堆中new一个新的对象,当量特别大是肯定会大大影响程序的效率。事物总有两面性,every sword has two sides,事情便简单了,性能也下来了。所以,在应用中,我们应该尽量避免装箱操作。
       了解了装箱和拆箱的操作,我们可以清楚的明白:装箱操作会导致数据在堆和栈上进行拷贝,频繁的装箱操作会性能损失。而相比而言拆箱过程对性能损耗还是比较小的。
装箱和拆箱的详细步骤

       1、装箱(box)的详细步骤:

      (1)、在堆上分配一个内存空间,大小等于需要装箱的值类型对象的大小加上两个引用类型对象都拥有的成员:类型对象指针和同步块引用。
      (2)、把堆栈上的值类型对象复制到堆上新分配的对象。
      (3)、返回一个指向堆上新对象的引用,并且存储到堆栈上被装箱的那个值类型的对象里。
        这个步骤不需要程序员自己编写,在任何出现装箱的地方,编译器会自动加上执行以上功能的IL代码。
        所谓的拆箱就是装箱对应着的概念,但拆箱的过程和装箱并不是倒过来就是:
       2、拆箱(unbox.any)的详细步骤
        如果为待拆箱对象为null,抛出NullReferenceException异常。
        如果引用指向的不是一个期望对象的已装箱对象,抛出InvalidCastException异常。
      (1)、获取已装箱对象中各个字段的地址,这个过程就是“拆箱”
       需要说明的是一般拆箱以后会伴随着对象的拷贝,但拷贝操作已经不是拆箱的范畴。

下面举两个小的例子来实现什么是装箱、拆箱以及怎样避免因频繁的装箱而耗费内存
(1)、装箱:   

using System;
   public class Test
   {
         public static void Main(String[] args)
        {
            int i = 10;
            //将值类型的i装箱
            //需要注意的是:这里的装箱采用的是值的拷贝
            object obj = i;
            //检验是否装箱成功了
            if(obj is int)
            {
               Console.WriteLine("数据已经装箱!");
            }
            //我们在这里更改i的值
            i = 33;
            Console.WriteLine("int i现在的值是:{0}",i);
           Console.WriteLine("int i装箱的值是:{0}",obj);
       }
    }

   

(2)、拆箱:

int i = 10;
    object obj = i;
    int j = (int)obj; 
   (3)、避免频繁的装箱:
    int i = 10;
    int j = 20;
    int s = 30;
    Console.WriteLine("i的值为{0},j的值为{1},s的值为{2}", i.ToString(), j.ToString(), s.ToString());

以上就是介绍了C#的装箱与拆箱,思路很清晰,涉及的内容很全面,包括装箱和拆箱的优缺点、装箱和拆箱的步骤等,很适合初学者进行学习。

更多轻松学习C#的装箱与拆箱相关文章请关注PHP中文网!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
c#.net适合您吗?评估其适用性c#.net适合您吗?评估其适用性Apr 13, 2025 am 12:03 AM

c#.netissutableforenterprise-levelapplications withemofrosoftecosystemdueToItsStrongTyping,richlibraries,androbustperraries,androbustperformance.however,itmaynotbeidealfoross-platement forment forment forment forvepentment offependment dovelopment toveloperment toveloperment whenrawspeedsportor whenrawspeedseedpolitical politionalitable,

.NET中的C#代码:探索编程过程.NET中的C#代码:探索编程过程Apr 12, 2025 am 12:02 AM

C#在.NET中的编程过程包括以下步骤:1)编写C#代码,2)编译为中间语言(IL),3)由.NET运行时(CLR)执行。C#在.NET中的优势在于其现代化语法、强大的类型系统和与.NET框架的紧密集成,适用于从桌面应用到Web服务的各种开发场景。

C#.NET:探索核心概念和编程基础知识C#.NET:探索核心概念和编程基础知识Apr 10, 2025 am 09:32 AM

C#是一种现代、面向对象的编程语言,由微软开发并作为.NET框架的一部分。1.C#支持面向对象编程(OOP),包括封装、继承和多态。2.C#中的异步编程通过async和await关键字实现,提高应用的响应性。3.使用LINQ可以简洁地处理数据集合。4.常见错误包括空引用异常和索引超出范围异常,调试技巧包括使用调试器和异常处理。5.性能优化包括使用StringBuilder和避免不必要的装箱和拆箱。

测试C#.NET应用程序:单元,集成和端到端测试测试C#.NET应用程序:单元,集成和端到端测试Apr 09, 2025 am 12:04 AM

C#.NET应用的测试策略包括单元测试、集成测试和端到端测试。1.单元测试确保代码的最小单元独立工作,使用MSTest、NUnit或xUnit框架。2.集成测试验证多个单元组合的功能,常用模拟数据和外部服务。3.端到端测试模拟用户完整操作流程,通常使用Selenium进行自动化测试。

高级C#.NET教程:ACE您的下一次高级开发人员面试高级C#.NET教程:ACE您的下一次高级开发人员面试Apr 08, 2025 am 12:06 AM

C#高级开发者面试需要掌握异步编程、LINQ、.NET框架内部工作原理等核心知识。1.异步编程通过async和await简化操作,提升应用响应性。2.LINQ以SQL风格操作数据,需注意性能。3..NET框架的CLR管理内存,垃圾回收需谨慎使用。

C#.NET面试问题和答案:提高您的专业知识C#.NET面试问题和答案:提高您的专业知识Apr 07, 2025 am 12:01 AM

C#.NET面试问题和答案包括基础知识、核心概念和高级用法。1)基础知识:C#是微软开发的面向对象语言,主要用于.NET框架。2)核心概念:委托和事件允许动态绑定方法,LINQ提供强大查询功能。3)高级用法:异步编程提高响应性,表达式树用于动态代码构建。

使用C#.NET建筑微服务:建筑师实用指南使用C#.NET建筑微服务:建筑师实用指南Apr 06, 2025 am 12:08 AM

C#.NET是构建微服务的热门选择,因为其生态系统强大且支持丰富。1)使用ASP.NETCore创建RESTfulAPI,处理订单创建和查询。2)利用gRPC实现微服务间的高效通信,定义和实现订单服务。3)通过Docker容器化微服务,简化部署和管理。

C#.NET安全性最佳实践:防止常见漏洞C#.NET安全性最佳实践:防止常见漏洞Apr 05, 2025 am 12:01 AM

C#和.NET的安全最佳实践包括输入验证、输出编码、异常处理、以及身份验证和授权。1)使用正则表达式或内置方法验证输入,防止恶意数据进入系统。2)输出编码防止XSS攻击,使用HttpUtility.HtmlEncode方法。3)异常处理避免信息泄露,记录错误但不返回详细信息给用户。4)使用ASP.NETIdentity和Claims-based授权保护应用免受未授权访问。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用