【C#】显示引用类型变量的内存地址(以字符串为例)
2014-11-27 20:01
411 查看
对于C/OC/C++程序员来说,输出一下所创建对象的内存地址,观察、分析或者单纯处于好奇心,都是很平常的事情。
然而对于将安全放在第一位的C#语言来说,这个“平常事”貌似并不那么直接。
本文在stackoverflow的问答基础上对C#语言显示引用类型内存的地址的方法进行了封装,
并以System.String和StringBuilder两个类为例展示了他们的内存地址变化情况。
博文首发地址:http://blog.csdn.net/duzixi
首先,在工程设置中,勾选“允许不安全代码”
其次,编写源代码如下:
关于神奇的GCHandle以及相关方法还有待进一步研究,不过从运行结果来看这样已经可以说明一些关于内存的问题了。
然而对于将安全放在第一位的C#语言来说,这个“平常事”貌似并不那么直接。
本文在stackoverflow的问答基础上对C#语言显示引用类型内存的地址的方法进行了封装,
并以System.String和StringBuilder两个类为例展示了他们的内存地址变化情况。
博文首发地址:http://blog.csdn.net/duzixi
首先,在工程设置中,勾选“允许不安全代码”
其次,编写源代码如下:
/// <summary>/// Get the memory address of reference type. /// 获取引用类型的内存地址 /// /// Created by duzixi.com 2014.11.27 /// www.lanou3g.com All Rights Reserved /// </summary> using System; using System.Text; using System.Runtime.InteropServices; namespace GetMemory { class MainClass { public static string getMemory(object o) // 获取引用类型的内存地址方法 { GCHandle h = GCHandle.Alloc(o, GCHandleType.Pinned); IntPtr addr = h.AddrOfPinnedObject(); return "0x" + addr.ToString("X"); } public static void Main (string[] args) { /// 不可变字符串 System.String string str1 = "不可变字符串"; string str2 = str1; string str3 = str1; str2 = "新的字符串"; // 当有新的赋值时,开辟新的空间, Console.WriteLine (str3); // 不发生改变 // str2指向新的地址,其它不变 Console.WriteLine("str1:" + getMemory(str1)); Console.WriteLine("str2:" + getMemory(str2)); Console.WriteLine("str3:" + getMemory(str3) + "\n"); /// 可变字符串 StringBuilder StringBuilder txt = new StringBuilder ("可变字符串"); StringBuilder aTxt = txt; StringBuilder bTxt = txt; aTxt.Append ("\n 后面追加另一个字符串"); Console.WriteLine (bTxt); // 另一个引用字符串内容随之发生改变 // 内存地址不变 Console.WriteLine(" txt:" + getMemory(txt)); Console.WriteLine("aTxt:" + getMemory(aTxt)); Console.WriteLine("bTxt:" + getMemory(bTxt)); } } }
关于神奇的GCHandle以及相关方法还有待进一步研究,不过从运行结果来看这样已经可以说明一些关于内存的问题了。
相关文章推荐
- 17.2015.08.04第十八节课 C#2 (数值类型及调用、引用类型及调用、装拆箱、常量、变量、数据类型转换、算术运算符、赋值运算符、关系运算符、逻辑运算符、字符串的常用方法)
- C# 引用类型-字符串类型
- C# 值类型、引用类型、装箱和拆箱、变量和常量
- C#字符串,浅谈值类型和引用类型
- c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程
- 引用数据类型---字符串变量
- C#命名空间的使用、添加命名空间、引用类型和值类型、字符串与char数组转换
- C#学习笔记--引用类型分类,对象类型、字符串类型、数字类型,类型转换
- 关于C#中货币类型和数值类型、字符串类型的转化和在DataGridView中的显示问题:
- C# 基础知识 (五).变量类型和字符串处理
- (原创)c#学习笔记05--变量的更多内容01--类型转换02--显示转换
- c# 字符串_数组与变量类型
- C#命名空间、值类型和引用类型、字符串的不可变性
- C#中交换两个引用类型变量的值
- 20151024_001_C#基础知识(静态与非静态的区别,值类型和引用类型,堆和栈的区别,字符串的不可变性,命名空间)
- C#类型和变量——引用类型
- C# string 拥有值类型特点的特殊引用类型 “字符串具有恒等性”
- c#字符串值类型与引用类型比较示例
- C#利用类型引用改变private类型变量的值
- C#之11 字符串的不可变性 -----值类型与引用类型