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

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

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

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

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

int i = ;
Object obj = i;

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

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

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

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

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

static void Main(string[] args)
{
int i = ;
string str = "";
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 + ).ToString();
}
else if(o.GetType()==typeof(String))
{
return o+ ""; }
else
{
return "";
}
}

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

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

五:装箱拆箱的性能影响

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

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

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

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

    为何要翻译 一来是为了感受国外优秀技术社区知名博主的高质量文章,二来是为了复习对.NET技术的基础拾遗达到温故知新的效果,最后也是为了锻炼一下自己的英文读写能力.因为是首次翻译英文文章(哎,原谅我这个 ...

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

    作者: Edison Chou  来源: 博客园  发布时间: 2014-09-03 15:59  阅读: 318 次  推荐: 2   原文链接   [收藏]   原文作者:Shivprasad k ...

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

    为何要翻译 一来是为了感受国外优秀技术社区知名博主的高质量文章,二来是为了复习对.NET技术的基础拾遗达到温故知新的效果,最后也是为了锻炼一下自己的英文读写能力.因为是首次翻译英文文章(哎,原谅我这个 ...

  4. 6个重要的.NET概念: - 堆栈,堆,值类型,引用类型,装箱和拆箱(转)

    今天在Code Project上面看到一篇文章<6 important .NET concepts: - Stack, heap, Value types, reference types, b ...

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

    为何要转载 一来是最近面试了几家公司,发现问的还都是这些的基础知识,二来是为了复习对.NET技术的基础拾遗达到温故知新的效果. 为什么有人说,不动笔不读书.我现在也是深有体会了,看过的东西不一定会记得 ...

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

    .NET六大剑客:栈.堆.值类型.引用类型.装箱和拆箱 一.“堆”,“栈”专区 这两个字我相信大家太熟悉了,甚至于米饭是什么?不知道...“堆”,“栈”是什么?哦,这个知道... 之前我也写过一篇堆栈 ...

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

    传送门:https://www.cnblogs.com/arthurliu/archive/2011/04/13/2015120.html

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

    值类型和引用类型简介 C#中存在两种数据类型,分别是值类型与引用类型,下面我们来看看这两种类型的区别. 值类型主要包括: 简单类型(如int.float.char等,注意string不是值类型): 枚 ...

  9. jQuery学习笔记 - 基础知识扫盲入门篇

    jQuery学习笔记 - 基础知识扫盲入门篇 2013-06-16 18:42 by 全新时代, 11 阅读, 0 评论, 收藏, 编辑 1.为什么要使用jQuery? 提供了强大的功能函数解决浏览器 ...

随机推荐

  1. Memcached安装教程及使用

    Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载 Table of contents 安装 使用 在spring中使用 安装 下载下来m ...

  2. bzoj4842: [Neerc2016]Delight for a Cat

    bzoj4842 这是一道网络流的题(大家都看出来了吧) 首先我们简化一下题目,选出最关键的部分(就是知道什么和要求什么,还有条件) 我们在这里把睡觉设为0,至少有t0时间在睡觉,把打隔膜设为1,至少 ...

  3. Keil软件编程问题归总

    Q:KEIL.uVision.RealView.MDK.KEIL C51之间的关系纠葛(比较区别)? A: KEIL是公司的名称,有时候也指KEIL公司的所有软件开发工具,目前2005年Keil由AR ...

  4. 基础概念——令人迷惑的EOF

    EOF概念常常使人迷惑. 首先我们要理解并没有像EOF字符这样的东西. 进一步讲EOF是由内核检测到的一种条件. 应用程序在它接收到由read函数返回的零返回码时,它就会发现EOF条件. 对于磁盘文件 ...

  5. VS 代码自动对齐快捷键

    全部代码代码自动对齐快捷键为 Ctrl + a(按后可松松手) + k(按后可松松手) + f

  6. Basic Calculator - Stack(表达式计算器)

    978. Basic Calculator https://www.lintcode.com/problem/basic-calculator/description public class Sol ...

  7. Mac 10.12安装远程桌面工具TeamViewer

    说明:个人使用时免费的,虽然启动时有弹框,但是不影响使用. 下载: https://www.teamviewer.com/zhCN/

  8. (转)MySQL 主从复制搭建,基于日志(binlog

    原文:http://blog.jobbole.com/110934/ 什么是MySQL主从复制 简单来说,就是保证主SQL(Master)和从SQL(Slave)的数据是一致性的,向Master插入数 ...

  9. $scope作用域与依赖注入

    一.$scope与$rootscope作用域 $scope下的数据作为该控制器下的数据moduel,只有在该控制器下才能够访问:而$rootScope则可以可以再任何有效的地方访问到,这个有效的地方指 ...

  10. python-fork聊天室

    服务端 #!/usr/bin/python from socket import * import sys import os class Node(object): def __init__(sel ...