簡體   English   中英

C#中的賦值和創建字符串實例有什么區別?

[英]What is the difference Between Assignment and Creating Instance of String in C#?

我有示例代碼。

var charMass = new char[] { 's', 't', 'r' };
string myString = new string(charMass);
string myString2 = new string(charMass);
string myString3 = "str";
string myString4 = "str";

bool bb1 = Object.ReferenceEquals(myString, myString2);
bool bb2 = Object.ReferenceEquals(myString, myString3);
bool bb3 = Object.ReferenceEquals(myString3, myString4);

為什么bb1和bb2是假的? 我知道equals必須顯示為true,因為它比較了值,但是那些字符串的內存分配呢? 為什么myString3和myString4指向堆中的同一塊內存但myString和myString2卻沒有?

C#編譯器優化它,因此相同的文字指向相同的字符串實例

MSDN

實習池保存字符串存儲。 如果為多個變量分配文字字符串常量,則每個變量都設置為在實習池中引用相同的常量 ,而不是引用具有相同值的幾個不同的String實例。

我在這里回答你的問題:

http://blogs.msdn.com/b/ericlippert/archive/2009/09/28/string-interning-and-string-empty.aspx

簡短的回答是:實習文字字符串便宜且容易 ,因此默認情況下完成。 實際動態分配的字符串通常以大量時間為代價節省少量字節,因此不值得打擾 如果你想強制實習,你可以自己動手。

myStringmyString2永遠不能引用 - 彼此相等(或任何其他字符串),因為您顯式調用了字符串構造函數,導致每次都創建一個新對象。 顯然,這個新對象不會被引用 - 等於任何其他已存在的對象。

myString3myString4是引用相等的,因為編譯器實現了字符串 :在編譯時用字符串文字初始化的字符串值最終是在運行時對同一對象的引用:

公共語言運行庫通過維護一個名為intern pool的表來保存字符串存儲,該表包含對在程序中以編程方式聲明或創建的每個唯一文字字符串的單個引用。 因此,具有特定值的文字字符串實例僅在系統中存在一次。

例如,如果將相同的文字字符串分配給多個變量,則運行時將從實習池中檢索對文字字符串的相同引用,並將其分配給每個變量。

也許編譯器以某種方式將"str"優化為單個文字 ,然后將其分配給每個變量,當然,字符串是指針,意味着它們都指向相同的地址。

這是基於框架中String的底層實現。

http://msdn.microsoft.com/en-us/library/system.string.intern.aspx

我看到的方式是,對於myString和myString2,您使用char []創建了那些,並且在創建字符串時,Intern池中沒有默認查找。

在myString3和myString4的情況下,myString3為InternPool和myString4增加了值,你只需要一個引用,因為它是樣本塊。

我之前的印象是在早期版本的框架中IsIntern是可選的,並且讓開發人員。 看起來不一定是這種情況

暫無
暫無

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

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