C#中的值类型及装箱
来源:互联网 发布:mfc 多串口编程 编辑:程序博客网 时间:2024/05/01 10:40
尽管在.NET框架里,我们不需要为内存管理以及垃圾收集操心,但我们还是应该了解它们,来优化我们的应用程序。其中之一便是,公共语言运行环境(CLR)是如何处理对值类型的引用的。 int i = 0; object obj = (object) i; //装箱 Console.WriteLine(obj.ToString()); 结果: 下面来一步一步分析这一过程 第一步:i 被放放置在栈上 第二步:i 被拷到堆上(装箱)并将 obj 放到栈上,obj 的值是在堆上的新对象的内在地址(即指针) 第三步:在堆上的对象被更新,值变为3 第四步:在栈上的对象 i 被更新,值变为1 下面是一个更复杂的例子: class Class1 { [STAThread] static void { MyInt test = new MyInt(); test.value = 100; test.AddOne(); aDelegate test.AddOne(); } } public delegate void aDelegate(); public struct MyInt { public int value; public void AddOne() { Console.WriteLine(string.Format("Before: {0}", value.ToString())); value += 1; Console.WriteLine(string.Format("After : {0}", value.ToString())); } } |
下面是输出: 结果有没有让你感意外?发生了什么?让我们来分析一下它的过程。在Main()和args[]被置于栈上后,主函数开始执行: 第一步:test被置于栈上 第二步:AddOne()被置于栈上并执行,将Mint.value的值变为101; 第三步:AddOne()被从栈上移除,Myint被装箱(拷)到堆上。现在Del指向MyInt对象在堆上的版本。 第四步:装箱的对象的AddOne()被调用,将其值更新为102. 第六步:Myint对象在栈上的版本(即test)的AddOne()入栈,将其值变为102. 最后:主函数执行完毕,栈被清空。而留在堆上的对象则等待被垃圾回收。
下面让我们做一个改变,来提高我们的应用程序的性能,并使其结果更符合我们的意愿。如果我们将MyInt改为引用类型,我们就只需处理在堆上的一个对象并且没有装箱的过程。 public class MyInt { public int value; public void AddOne() { Console.WriteLine(string.Format("Before: {0}", value.ToString())); value += 1; Console.WriteLine(string.Format("After : {0}", value.ToString())); } } 修改后,我们得到了我们期望的结果: Before: 100 总结 当我们在一个值类型上调用ToString()或是GetType(),会有更多的意想不到的装箱过程。因为在这种情况下,方法是从基类(System.Object)被调用,所以必需经过装箱过程后,方法才能被调用。当我们将值类型加入ArrayList()(在这种情况下它们被类型转换为System.Object)时也会发生装箱过程。你可以想象,当装箱过程大规模发生时,将会严重影响程序的性能。 |
- C#中的值类型及装箱
- C#中的值类型及装箱
- C#中的值类型及装箱
- (转载)C#中的值类型及装箱[翻译]
- C# 引用类型、值类型与拆箱、装箱
- c# 值类型和引用类型的区别,装箱,拆箱。
- 引用类型、数值类型及装箱
- 很不错的C#类型讲解,堆,栈,值类型,引用类型,装箱,拆箱
- 很不错的C#类型讲解,堆,栈,值类型,引用类型,装箱,拆箱
- Visual Studio 2010——C#中的装箱拆箱操作与Object类型
- C#基础-类型强制转换,拆箱,装箱
- 了解c#中 值类型/引用类型,装箱/拆箱,Object类
- 深入C#内存管理来分析 值类型、引用类型、装箱、拆箱、堆栈几个概念组合
- 深入C#内存管理来分析 值类型、引用类型、装箱、拆箱、堆栈几个概念组合
- C# 值类型、引用类型、装箱和拆箱、变量和常量
- C#值类型与引用类型,装箱与拆箱操作
- C#基础知识--引用类型和值类型/装箱和拆箱操作
- Android中的java基础(二)——装箱与拆箱及不同基本类型的比较(类型转换)
- MS SQL Server查询优化方法
- 栈和托管堆/值类型和引用类型/强制类型转换/装箱和拆箱
- 学习如何进行 “测试驱动开发”
- DIV背景半透明,DIV中的字不半透明
- The pain in my heart
- C#中的值类型及装箱
- 论芙蓉精神于网站发展
- 全面掌握SOA 认清SOA面临的挑战
- 获取MS SQL库数据字典的经典SQL语句
- 毕业有感
- (转帖)小菜编程成长记(八 用“策略模式”是一种好策略)
- C++中union的应用剖析
- C# Infralution Licensing System学习笔记(四)Compact Framework Application应用
- 调试