對於C/OC/C++程序員來說,輸出一下所創建對象的內存地址,觀察、分析或者單純處於好奇心,都是很平常的事情。
然而對於將安全放在第一位的C#語言來說,這個“平常事”貌似並不那麼直接。
本文在stackoverflow的問答基礎上對C#語言顯示引用類型內存的地址的方法進行了封裝,
並以System.String和StringBuilder兩個類為例展示了他們的內存地址變化情況。
首先,在工程設置中,勾選“允許不安全代碼”
其次,編寫源代碼如下:
////// Get the memory address of reference type. /// 獲取引用類型的內存地址 /// /// Created by duzixi.com 2014.11.27 /// www.lanou3g.com All Rights Reserved /// 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) + ); /// 可變字符串 StringBuilder StringBuilder txt = new StringBuilder (可變字符串); StringBuilder aTxt = txt; StringBuilder bTxt = txt; aTxt.Append ( 後面追加另一個字符串); Console.WriteLine (bTxt); // 另一個引用字符串內容隨之發生改變 // 內存地址不變 Console.WriteLine( txt: + getMemory(txt)); Console.WriteLine(aTxt: + getMemory(aTxt)); Console.WriteLine(bTxt: + getMemory(bTxt)); } } }