2012-11-04 41 views

回答

4

我不知道肯定,但它似乎是const字符串将被分配不同的。特别是,他们不会有资格进行垃圾回收。所以它可能是它们与从资源加载的字符串相比,它们的开销较少。但是,这种差异可能很小。除非你有大量的字符串,否则你不会注意到堆内存使用情况的差异。

const用于事情永远不会改变。资源字符串用于可能会改变的事物。你决定使用哪一个应该是基于此,而不是在堆上占用更多空间。

+0

但是......实际上是从资源加载的字符串?这对我来说似乎很浪费。如果它是用C++编写的,例如它将位于静态存储器的某个区域,从DLL加载而不需要打扰内存分配。如果是这样的话,我会坚持const。 –

2

要我knowlwdge字符串文字拘留(的String.intern),所以不存在重复和使用没有额外拨款。我不认为默认情况下资源字符串的行为方式是一样的。

如果这是一个问题,你可以有从资源自己的代码阅读和实习串并验证它是否是你的情况是有益的。

边注:常量字符串,并从资源字符串通常用于非常不同的目的(一个静态的文化不变值,另 - 本地化,并有望成为不同文化背景的不同)。应该有很好的理由将可本地化的字符串迁移为代码中的常量。

+0

关于本地化的好处,他们确实服务于不同的目的。 –

3

你读过关于string interning吗? .NET保留一个字符串缓存,使得一个字符串在内存中只存在一次 - 可能会永远存在。常量字符串将被禁用。动态构建的字符串(即使用StringBuilder)不会被拦截。

根据答案this question,在资源文件中字符串不拘留。如果这是真的,并且您的资源中加载了大量重复字符串的许多资源文件,则内存中可能会有大量字符串重复。

+0

关于实习,非常好的一点,加上其他答案资源文件的意思是本地化,而不是优化。 –

+0

更糟的是,资源文件上的字符串通过另一个字符串检索 - ResourceManager用来从正确的区域性加载正确字符串的资源名称。没关系... –