簡體   English   中英

C#如何存儲字符串

[英]C# How to store a string

我想學習像“ Hello World”這樣寫的字符串值的存儲位置或存儲方式。

例如:

范例1:

radLabel1.Text = "Hello";
radLabel2.Text = "Hello";
radLabel3.Text = "Hello";

范例2:

string strTemp = "Hello";
radLabel1.Text = strTemp;
radLabel2.Text = strTemp;
radLabel3.Text = strTemp;

我知道第二種方法最有用,並且我正在這樣做,但是我想知道示例1的字符串如何存儲在RAM中。 我以為,盡管它們相同,但在RAM中為它們創建了三個位置來存儲它們。 但是在示例2中,僅為示例2的字符串創建了一個位置,並使用該地址訪問了該地址。 我對嗎 ? 您能解釋一下還是將變量存儲在RAM中?

經常使用的術語是字符串文字是“ interned”的。 這是一個毫無意義的術語,並沒有描述到底發生了什么。

.NET程序集包含兩個數據塊,即元數據和IL。 元數據主要用於描述程序集中的類型,並包含資源。 IL是您編寫的代碼,已轉換為中間語言格式。

元數據部分有5個表,其中之一稱為“字符串表”。 高度描述其包含的內容,這就是“ Hello”字符串的存儲位置。 它已經具有與通常將字符串存儲在垃圾收集堆中的方式相同的格式,但是在對象標頭中帶有一個額外的標志,指示它是字符串文字並且未存儲在堆中。

程序集內容通過內存映射文件映射到虛擬內存,該文件與.NET System.IO.MemoryMappedFiles.MemoryMapFile類完全相同。 strTemp對象引用將由抖動發出的單個MOV指令初始化,並存儲一個指針,該指針直接指向文件映射視圖中的字符串表條目。 程序第一次實際使用字符串內容時,操作系統頁面錯誤將確保字符串出現在RAM中。

垃圾收集器在執行收集時將找到strTemp對象引用。 但是只是忽略引用,對象標頭中的標志表示應該這樣做,因為字符串對象實際上沒有存儲在垃圾回收堆中。 這實際上是“實習”的意思。

在示例2中,您將在第一行上創建一個字符串。 然后,您只需將對它的引用傳遞給這3個標簽。 如您所說,它仍然是內存中的單個對象。 但是,由於字符串在C#中是不可變的,因此將新字符串分配給radLabel2.Text不會更改其他字符串的值,而是創建一個新字符串。

我以為,盡管它們相同,但在RAM中為它們創建了三個位置來存儲它們。

字符串被拘禁

當它們是相同的字符串常量時,僅保留一個副本。這意味着在第一個示例中,僅存在一個“ Hello”。

當你宣布

   radLabel1.Text="Hello";

它會在內存中的某個位置創建一個值為Hello的臨時字符串,並將該值傳遞給radLabel.text。 對於radLabel2.Text和radLabel3.text,程序stil創建temp 2和temp 3來存儲“ Hello”。 Beause沒有什么可以告訴程序它們是相同的。

但是,當你宣布

   string strTemp = "Hello";

它會在內存中創建一個字符串(當然),但是不同於“ Hello”。因為它們為此創建了一個名稱。 此工作就像計算機的桌面快捷方式。 因此,當您使用它時,您只是調用了快捷方式,並且由於已經定義了該值,因此它繞開了創建新字符串的過程。

希望你能理解

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM