引言 本篇文章主要介绍.NET中6个重要的概念:栈,堆,值类型,引用类型,装箱,拆箱.文章开始介绍当你声明一个变量时,编译器内部发生了什么,然后介绍两个重要的概念:栈和堆:最后介绍值类型和引用类型,并说明一些有关它们的重要原理. 最后通过一个简单的示例代码说明装箱拆箱带来的性能损耗. 声明变量的内部机制 在.NET程序中,当你声明一个变量,将在内存中分配一块内存.这块内存分为三部分:1,变量名:2,变量类型:3,变量值. 下图揭示了声明一个变量时的内部机制,其中分配的内存类型依据你的变量类型..…
引言 本篇文章主要介绍.NET中6个重要的概念:栈,堆,值类型,引用类型,装箱,拆箱.文章开始介绍当你声明一个变量时,编译器内部发生了什么,然后介绍两个重要的概念:栈和堆:最后介绍值类型和引用类型,并说明一些有关它们的重要原理. 最后通过一个简单的示例代码说明装箱拆箱带来的性能损耗. 声明变量的内部机制 在.NET程序中,当你声明一个变量,将在内存中分配一块内存.这块内存分为三部分:1,变量名:2,变量类型:3,变量值. 下图揭示了声明一个变量时的内部机制,其中分配的内存类型依据你的变量类型..…
目前在看CLR via C#,把总结的记下来,索性就把他写成一个系列吧. 1.[.Net基础一] 类型.对象.线程栈.托管堆运行时的相互关系 2.[.Net基础二]浅谈引用类型.值类型和装箱.拆箱 引用类型和值类型 引用类型:分配在托管堆中.引用类型直接继承自System.Object.引用类型可以被继承. 常用的引用类型有:数组. 类. 接口. 委托. 字符串 值类型:可分配在线程栈和托管堆中.所有值类型都分为结构或枚举.值类型直接继承自System.ValueType.值类型不可以被继承.…
原文:[CLR via C#]5.3 值类型的装箱和拆箱 在CLR中为了将一个值类型转换成一个引用类型,要使用一个名为装箱的机制. 下面总结了对值类型的一个实例进行装箱操作时内部发生的事: 1)在托管堆中分配好内存.分配的内存量是值类型的各个字段需要的内存量加上托管堆上的所有对象都有的两个额外成员(类型对象指针和同步块索引)需要的内存量. 2)值类型的字段复制到新的分配的堆内存. 3)返回对象的地址.现在,这个地址是对一个对象的引用,值类型现在是一个引用类型. 拆箱不是直接将装箱过程倒过来.拆箱…
1.装箱 为了将一个值类型转换成一个引用类型,要使用一个名为装箱(Boxing)的机制. 1.在托管堆中分配好内存.分配的内存量是值类型的各个字段需要的内存量加上托管堆的所有对象都有的两个额外成员(类型对象指针和同步块索引)需要的内存量. 2.值类型的字段复制到新分配的堆内存. 3.返回对象的地址.现在,这个地址是对一个对象的引用,值类型现在是一个引用类型. 2.拆箱 包含在已装箱对象中的所有字段都必须复制到值类型变量中,后者在线程栈上.CLR分两步完成这个复制操作. 第一步是获取已装箱的对象中…
装箱 总所周知,值类型是比引用类型更“轻型”的一种类型,因为它们不作为对象在托管堆中分配,不会被垃圾回收,也不通过指针来引用.但在许多情况下,都需要获取对值类型的一个实例的引用.例如,假定要创建一个ArrayList 对象(System.Collections 命名空间中定义的一个类型)来容纳一组 Point 结构,那么代码可能像下面这样: // 声明一个值类型 struct Point { public Int32 x, y; } public sealed class Program { p…
我们先来看一个示例代码: 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…
[注意]:如果知道自己写的代码会造成编译器反复对一个值类型进行装箱,请改成用手动方式对值类型进行装箱. [好处]:代码会变得更小.更快. [例子]: using System; public sealed class Program { public static void Main() { //创建一个未装箱的值类型变量 Int32 v = ; //编译代码时,v会被装箱三次,浪费时间和内存 Console.WriteLine("{0}, {1}, {2}", v, v, v); /…
一.托管类型与非托管类型 1.托管类型 托管类型包括 引用类型 以及 包含有引用类型或托管类型成员的结构. 引用类型 含引用类型或托管类型成员(字段.自动实现 get 访问器的属性)的结构 // 托管结构. (这里的struct 包含了引用类型字段) public struct Foo { public string Name; // 包含引用类型字段. public string Bar { get; private set; } // 包含自动实现 get 访问器的引用类型属性. } pub…
在学习.NET的时候,因为一些疑问,让我打算把.NET的类型篇做一个总结.总结以三篇博文的形式呈现. 这篇博文,作为三篇博文的第一篇,主要探讨了.NET Framework中的基本类型,以及这些类型一些重要的特性. 第二篇中,我会探讨.NET 是如何实现两个对象的比较的,其中会用到第一篇中的基础和结论. 第三篇,我从CLR中的常用容器出发,来探讨泛型以及它们背后的数据结构. 下面,我们从类型说起. Primitive, Reference and Value 首先将这三种类型放在一起是不科学的.…