[CLR via C#]值类型的装箱和拆箱】的更多相关文章

我们先来看一个示例代码: namespace ConsoleApplication1 { class Program { static void Main(string[] args) { ArrayList a = new ArrayList(); Point p; ; i < ; i++) { p.x = p.y = i; a.Add(p); } Console.ReadKey(); } } struct Point { public Int32 x, y; } } 在本例中,ArrayLi…
原文:[CLR via C#]5.3 值类型的装箱和拆箱 在CLR中为了将一个值类型转换成一个引用类型,要使用一个名为装箱的机制. 下面总结了对值类型的一个实例进行装箱操作时内部发生的事: 1)在托管堆中分配好内存.分配的内存量是值类型的各个字段需要的内存量加上托管堆上的所有对象都有的两个额外成员(类型对象指针和同步块索引)需要的内存量. 2)值类型的字段复制到新的分配的堆内存. 3)返回对象的地址.现在,这个地址是对一个对象的引用,值类型现在是一个引用类型. 拆箱不是直接将装箱过程倒过来.拆箱…
目前在看CLR via C#,把总结的记下来,索性就把他写成一个系列吧. 1.[.Net基础一] 类型.对象.线程栈.托管堆运行时的相互关系 2.[.Net基础二]浅谈引用类型.值类型和装箱.拆箱 引用类型和值类型 引用类型:分配在托管堆中.引用类型直接继承自System.Object.引用类型可以被继承. 常用的引用类型有:数组. 类. 接口. 委托. 字符串 值类型:可分配在线程栈和托管堆中.所有值类型都分为结构或枚举.值类型直接继承自System.ValueType.值类型不可以被继承.…
1.装箱 为了将一个值类型转换成一个引用类型,要使用一个名为装箱(Boxing)的机制. 1.在托管堆中分配好内存.分配的内存量是值类型的各个字段需要的内存量加上托管堆的所有对象都有的两个额外成员(类型对象指针和同步块索引)需要的内存量. 2.值类型的字段复制到新分配的堆内存. 3.返回对象的地址.现在,这个地址是对一个对象的引用,值类型现在是一个引用类型. 2.拆箱 包含在已装箱对象中的所有字段都必须复制到值类型变量中,后者在线程栈上.CLR分两步完成这个复制操作. 第一步是获取已装箱的对象中…
装箱 总所周知,值类型是比引用类型更“轻型”的一种类型,因为它们不作为对象在托管堆中分配,不会被垃圾回收,也不通过指针来引用.但在许多情况下,都需要获取对值类型的一个实例的引用.例如,假定要创建一个ArrayList 对象(System.Collections 命名空间中定义的一个类型)来容纳一组 Point 结构,那么代码可能像下面这样: // 声明一个值类型 struct Point { public Int32 x, y; } public sealed class Program { p…
[注意]:如果知道自己写的代码会造成编译器反复对一个值类型进行装箱,请改成用手动方式对值类型进行装箱. [好处]:代码会变得更小.更快. [例子]: using System; public sealed class Program { public static void Main() { //创建一个未装箱的值类型变量 Int32 v = ; //编译代码时,v会被装箱三次,浪费时间和内存 Console.WriteLine("{0}, {1}, {2}", v, v, v); /…
在学习.NET的时候,因为一些疑问,让我打算把.NET的类型篇做一个总结.总结以三篇博文的形式呈现. 这篇博文,作为三篇博文的第一篇,主要探讨了.NET Framework中的基本类型,以及这些类型一些重要的特性. 第二篇中,我会探讨.NET 是如何实现两个对象的比较的,其中会用到第一篇中的基础和结论. 第三篇,我从CLR中的常用容器出发,来探讨泛型以及它们背后的数据结构. 下面,我们从类型说起. Primitive, Reference and Value 首先将这三种类型放在一起是不科学的.…
谈到装箱拆箱,大概的意思就是值类型和引用类型的相互转换呗---值类型到引用类型叫装箱,反之则叫拆箱.这当然没有问题,可是你只知道这么多,那么建议你花点时间看看楼主这篇文章 1. .NET中的类型 为了说明装箱和拆箱,那首先必须先说类型.在.NET中,我们知道System.Object类型是所有内建类型的基类.注意这里说的是内建类型,程序员可以编写不继承子自System.Object的类型,这里不做过多的介绍(感兴趣的博友可以研究一下). 所有.NET的类型都可以分为两类(有点不严谨,但是大家都这…
前言 本文中大部分示例代码来自于<CLR via C# Edition3>,并在此之上加以总结和简化,文中只是重点介绍几个比较有共性的问题,对一些细节不会做过深入的讲解. 前几天一直忙着翻译有关内存中堆和栈的问题博文<C#堆vs栈>,正是在写作本文的过程中对有些地方还是产生了很多的Why,所以就先翻译并学习了一些C/C++方面的知识,这样有助于解决CLR之外的一些困惑,希望多大家有所帮助. 对知识的理解上难免有偏差或不正确,如有疑问以及错误,还请大家回复~~~ 值类型和引用类型的不…
1.      装箱和拆箱是一个抽象的概念 2.      装箱是将值类型转换为引用类型 :拆箱是将引用类型转换为值类型       利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类型链接起来 例如: int val = 100; object obj = val; Console.WriteLine (“对象的值 = {0}", obj); 这是一个装箱的过程,是将值类型转换为引用类型的过程 int val = 100; object obj =…