2012-11-04 86 views

回答

4

我不知道肯定,但它似乎是const字符串將被分配不同的。特別是,他們不會有資格進行垃圾回收。所以它可能是它們與從資源加載的字符串相比,它們的開銷較少。但是,這種差異可能很小。除非你有大量的字符串,否則你不會注意到堆內存使用情況的差異。

const用於事情永遠不會改變。資源字符串用於可能會改變的事物。你決定使用哪一個應該是基於此,而不是在堆上佔用更多空間。

+0

但是......實際上是從資源加載的字符串?這對我來說似乎很浪費。如果它是用C++編寫的,例如它將位於靜態存儲器的某個區域,從DLL加載而不需要打擾內存分配。如果是這樣的話,我會堅持const。 –

2

要我knowlwdge字符串文字拘留(的String.intern),所以不存在重複和使用沒有額外撥款。我不認爲默認情況下資源字符串的行爲方式是一樣的。

如果這是一個問題,你可以有從資源自己的代碼閱讀和實習串並驗證它是否是你的情況是有益的。

邊注:常量字符串,並從資源字符串通常用於非常不同的目的(一個靜態的文化不變值,另 - 本地化,並有望成爲不同文化背景的不同)。應該有很好的理由將可本地化的字符串遷移爲代碼中的常量。

+0

關於本地化的好處,他們確實服務於不同的目的。 –

3

你讀過關於string interning嗎? .NET保留一個字符串緩存,使得一個字符串在內存中只存在一次 - 可能會永遠存在。常量字符串將被禁用。動態構建的字符串(即使用StringBuilder)不會被攔截。

根據答案this question,在資源文件中字符串不拘留。如果這是真的,並且您的資源中加載了大量重複字符串的許多資源文件,則內存中可能會有大量字符串重複。

+0

關於實習,非常好的一點,加上其他答案資源文件的意思是本地化,而不是優化。 –

+0

更糟的是,資源文件上的字符串通過另一個字符串檢索 - ResourceManager用來從正確的區域性加載正確字符串的資源名稱。沒關係... –