当我们在资源文件中定义字符串常量而不是在claass中声明为const时,在堆内存占用方面是否有优势?
答案 0 :(得分:4)
我不确定,但似乎const
字符串的分配方式不同。特别是,他们没有资格进行垃圾收集。所以可能它们与它们相关的开销比从资源加载的字符串少。然而,差异可能非常小。除非你有大量的字符串,否则你不会注意到堆内存使用量的差异。
const
用于永不更改的内容。资源字符串用于可能发生变化的内容。您决定使用哪个,而不是基于哪个占用更多空间。
答案 1 :(得分:3)
您是否了解过string interning? .NET保留字符串的缓存,使得字符串在内存中只存在一次 - 可能永远存在。常量字符串将被实现。动态构建的字符串(即使用StringBuilder)不会被实现。
根据答案this question,资源文件中的字符串不会被中断。如果这是真的,并且您在其资源中加载了许多具有大量重复字符串的资源文件,则内存中可能会有大量字符串重复。
答案 2 :(得分:2)
对于我的knowlwdge字符串文字是interned(String.Intern)所以没有重复项,也没有额外的使用分配。我不认为默认情况下资源字符串的行为方式相同。
如果这是一个问题,您可以拥有自己的代码读取和来自资源的实习字符串,并验证它是否对您的案例有益。
旁注:来自资源的常量字符串和字符串通常用于非常不同的目的(一个静态文化不变值,另一个 - 可本地化并且预期对于不同文化是不同的)。应该有很好的理由将可本地化的字符串迁移到代码中的常量。