2013-04-21 19 views
1

我很好奇字符串分配。如果我有一個名爲mystring = "test"的常量,我可以在應用程序的任何位置使用「測試」而不分配任何新數據嗎?看下面,這個方法會分配任何新的數據嗎?將聲明多個具有相同內容的字符串文字分配額外的內存嗎?

const string mystring = "test" 
void test() 
{ 
    for(int i = 0; i < 100000;i++) 
    { 
     allocationTest(); 
    }   
} 

void allocationTest() 
{ 
    Console.Write("test"); 
} 
+7

http://msdn.microsoft.com/en-us/library/system.string.intern.aspx – SLaks 2013-04-21 21:38:37

+0

甜,謝謝Slaks它讀完後終於點擊:D – TimD 2013-04-21 21:53:22

回答

4

不,該方法不會分配任何數據。

編譯器會合並任何重複的字符串文字,因此兩個文字文字"test"實際上是應用程序啓動時創建的一個字符串。

另外,即使該字符串不會在兩個地方存在,當您使用它時也不會分配字符串文字,它會在應用程序啓動時分配。擁有引用字符串的常量不會影響方法中使用的字符串字面值。

+0

謝謝,我總是在一個新的印象下對象總是在使用引號時做出的。我讀過它,仍然懷疑,需要一些保證:) – TimD 2013-04-21 21:59:58

1

如果編譯器在一個項目中的代碼中找到兩個常量字符串值,它將使用一個實例。

如果編譯在多個項目中的代碼中找到兩個常量字符串值,則每個項目(dll或exe)都會獲得自己的實例。這是因爲dll的/ exe應該能夠單獨運行。

如果在運行期間創建字符串(例如,通過逐行讀取文件或從數據庫讀取數據),則每個字符串(即使具有相同的值)都將成爲單獨的實例。這可以通過使用函數string.Intern來防止(請參閱:http://msdn.microsoft.com/en-us/library/system.string.intern.aspx)。

相關問題