5

当我们在资源文件中定义字符串常量而不是在类中声明为 const 时,在堆内存占用方面是否有优势?

4

3 回答 3

5

我不确定,但似乎const字符串的分配方式不同。特别是,他们将没有资格进行垃圾收集。因此,与从资源加载的字符串相比,与它们相关的开销可能更少。但是,差异可能非常小。除非您有大量字符串,否则您不会注意到堆内存使用量的差异。

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

于 2012-11-04T03:15:13.010 回答
4

你读过字符串实习吗?.NET 保留一个字符串缓存,这样一个字符串在内存中只存在一次——可能永远存在。常量字符串将被实习。动态构建的字符串(即使用 StringBuilder)不会被实习。

根据this question的回答,资源文件中的字符串没有被保留。如果这是真的,并且您在其资源中加载了许多带有大量重复字符串的资源文件,那么内存中可能会有很多重复的字符串。

于 2012-11-04T03:48:50.977 回答
3

据我所知,字符串文字是实习的(String.Intern),因此没有重复,也没有额外的使用分配。我认为默认情况下资源字符串的行为方式不同。

如果这是一个问题,您可以让您自己的代码从资源中读取和实习字符串,并验证它是否对您的案例有益。

旁注:来自资源的常量字符串和字符串通常用于非常不同的目的(一个是静态文化不变值,另一个 - 可本地化并且预期对于不同的文化会有所不同)。将可本地化的字符串迁移为代码中的常量应该有很好的理由。

于 2012-11-04T03:44:35.987 回答