C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)

一:值类型和引用类型的含义参考前一篇文章

  C#学习笔记(基础知识回顾)之值类型和引用类型

  1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型。如果int只不过是栈上的一个4字节的值,该如何在它上面调用方法?

二:值类型转换为引用类型——装箱

  2.1CLR对值类型进行装箱时:新分配托管堆内存,将值类型的实例字段拷贝到新分配的内存中,返回托管堆中新分配对象的地址。这个地址就是一个指向对象的引用。

int i = 10;
Object obj = i;

三:将引用类型转换为值类型——拆箱

  3.1只能对以前装箱的变形进行拆箱,拆箱是将对象转换为原来的类型

int i = 10;
Object obj = i;
int j = (int)obj;

四:为什么需要装箱拆箱?

  4.1一种最普通的场景是,调用一个含类型为Object的参数的方法,该Object可支持任意为型,以便通用。当你需要将一个值类型传入时,需要装箱。例如:AddOne接收一个Object类型参数,如果是int32类型则数值加1,如果是string类型则加字符串“1”。

static void Main(string[] args)
        {
            int i = 10;
            string str = "10";
            Console.WriteLine(AddOne(i));//输出11
            Console.WriteLine(AddOne(str));//输出101
            Console.ReadKey();
        }
        public static string AddOne(Object o)
        {
            if (o.GetType() == typeof (Int32))
            {
                return ((int) o + 1).ToString();
            }
            else if(o.GetType()==typeof(String))
            {
                return o+ "1";

            }
            else
            {
                return "1";
            }
        }

  4.2另一种用法是,一个非泛型的容器,同样是为了保证通用,而将元素类型定义为Object。于是,要将值类型数据加入容器时,需要装箱。例如:

var array = new ArrayList();
            array.Add(1);
            array.Add("2");

            foreach (var value in array)
            {
                Console.WriteLine("value is {0}", value);
            }
            //结果输出是:value is 1
            //            value is 2
            Console.ReadKey();

五:装箱拆箱的性能影响

从原理上可以看出,装箱时,生成的是全新的引用对象,这会有时间损耗,也就是造成效率降低。 
所以,应该尽量避免装箱。

比如4.1的情况可以通过方法重载避免,4.2尽量使用泛型规避装箱拆箱操作。

时间: 2024-12-25 22:20:39

C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)的相关文章

.NET中六个重要的概念:栈、堆、值类型、引用类型、装箱和拆箱 (转)

作者: Edison Chou  来源: 博客园  发布时间: 2014-09-03 15:59  阅读: 318 次  推荐: 2   原文链接   [收藏] 原文作者:Shivprasad koirala 英文原文:Six important .NET concepts: Stack, heap, value types, reference types, boxing, and unboxing 一.概述 本文会阐述六个重要的概念:堆.栈.值类型.引用类型.装箱和拆箱.本文首先会通过阐述当

.NET中的六个重要概念:栈、堆、值类型、引用类型、装箱和拆箱

内容导读 概述 当你声明一个变量背后发生了什么? 堆和栈 值类型和引用类型 哪些是值类型,哪些是引用类型? 装箱和拆箱 装箱和拆箱的性能问题 一.概述 本文会阐述六个重要的概念:堆.栈.值类型.引用类型.装箱和拆箱.本文首先会通过阐述当你定义一个变量之后系统内部发生的改变开始讲解,然后将关注点转移到存储双雄:堆和栈.之后,我们会探讨一下值类型和引用类型,并对有关于这两种类型的重要基础内容做一个讲解. 本文会通过一个简单的代码来展示在装箱和拆箱过程中所带来的性能上的影响,请各位仔细阅读. 二.当你

【译】.NET中六个重要的概念:栈、堆、值类型、引用类型、装箱和拆箱

为何要翻译 一来是为了感受国外优秀技术社区知名博主的高质量文章,二来是为了复习对.NET技术的基础拾遗达到温故知新的效果,最后也是为了锻炼一下自己的英文读写能力.因为是首次翻译英文文章(哎,原谅我这个菜比,弱爆了!),所以肯定会有很多问题(有些语句理解不透彻,翻译出来也不通顺,还请不吝赐教),也请各位园友多多指正,谢谢! 关于原文作者 原文作者:Shivprasad koirala 原文地址:http://www.codeproject.com/Articles/76153/Six-import

6个重要的.NET概念栈,堆,值类型,引用类型,装箱,拆箱

介绍 这篇文章将解释6个重要的概念:栈,堆,值类型,引用类型,装箱,拆箱.本文将会阐述当你声明一个变量时发生了什么并提前说明两个重要个概念:栈和堆.文章将围绕引用类型和值类型澄清一些重要基本信息.并通过一个简单的示例来演示装箱和拆箱引起的性能损失. 声明一个变量时发生了什么? 当你在.NET应用程序中声明了一个变量时,将会从RAM中分配一小块内存,在内存中存在三样东西:变量名称,数据类型和变量的值. 我们简单的说明下在内存中发生了什么,要知道变量在内存中的分配是取决于数据类型的.这里存在两种类型

值类型,引用类型,装箱,拆箱

值类型包括原类型(Sbyte.Byte.Short.Ushort.Int.Uint.Long.Ulong.Char.Float.Double.Bool.Decimal).枚举(enum).结构(struct),引用类型包括:类.数组.接口.委托.字符串等. 值型就是在栈中分配内存,在申明的同时就初始化,以确保数据不为NULL: 引用型是在堆中分配内存,初始化为null,引用型是需要GARBAGE COLLECTION来回收内存的,值型不用,超出了作用范围,系统就会自动释放! 值类型的变量包含自身

堆栈,堆,值类型,引用类型,装箱和拆箱

当你声明一个变量时内存中都发生了什么? 当你在一个.Net应用程序中声明一个变量时,首先要分配一些内存快到RAM,它包括三样东西,第一个是变量名,第二个是变量的数据类型,最后一个是变量的值. 这只是一个很简单的解释,根据变量的数据类型不同,有两种内存分配类型:堆栈内存和堆内存. 图 2 声明变量后的内存结构 堆栈(stack)和堆(heap) 为了帮助理解堆栈和堆,让我们了解下面的代码内部究竟发生了什么. public void Method1() { // Line 1 int i=4; //

.NET六大剑客:栈、堆、值类型、引用类型、装箱和拆箱

一.“堆”,“栈”专区 这两个字我相信大家太熟悉了,甚至于米饭是什么?不知道...“堆”,“栈”是什么?哦,这个知道... 之前我也写过一篇堆栈的文章,不过写的不深刻,剖析的也不全面,所以今天也参考了一些大牛的资料. 一.预备知识—程序的内存分配    一个由C/C++编译的程序占用的内存分为以下几个部分    1.栈区(stack)—   由编译器自动分配释放   ,存放函数的参数值,局部变量的值等.其    操作方式类似于数据结构中的栈.栈是一个内存数组,是一个LIFO(last-in  f

理解栈、堆、值类型、引用类型、装箱和拆箱

.net中有2种可分配的内存类型:栈和堆 .net基元数据类型是指编译器直接支持的数据类型 .net定义一个变量,系统会为其分配一块内存块,包括:变量名称.数据类型.变量值 当一个值类型的变量赋值给另一个值类型变量时,实际上是创建一个值的副本,值的变化在变量间互不影响.引用类型变量的值为数据值的引用,值变化实际为同一数据值的变化,两个变量引用同一数值,故变量值更改相互有影响. .net中变量存储到栈或堆上取决于数据类型,引用类型(object 和 string)存储于堆中,值类型存储于栈中 当一

【Unity|C#】番外篇(3)——6个重要概念:栈与堆,值类型与引用类型,装箱与拆箱

传送门:https://www.cnblogs.com/arthurliu/archive/2011/04/13/2015120.html 原文地址:https://www.cnblogs.com/shahdza/p/12237090.html

C#学习笔记(三):值类型、引用类型及参数传递

值类型和引用类型简介 C#中存在两种数据类型,分别是值类型与引用类型,下面我们来看看这两种类型的区别. 值类型主要包括: 简单类型(如int.float.char等,注意string不是值类型): 枚举类型(enum): 结构体类型(struct): 引用类型主要包括: 类类型(如string): 数组类型(一维或多维数组): 接口类型(interface): 委托类型(delegate): 内存分布 值类型的实例大部分情况下会被存放在线程的堆栈上,由操作系统管理其在内存上的分配和释放. 引用类