程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中顯示引用類型變量的內存地址(以字符串為例)

C#中顯示引用類型變量的內存地址(以字符串為例)

編輯:C#入門知識

C#中顯示引用類型變量的內存地址(以字符串為例)


對於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));

		}
	}
}

關於神奇的GCHandle以及相關方法還有待進一步研究,不過從運行結果來看這樣已經可以說明一些關於內存的問題了。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved