静态只读字段和性能

4
假设我有一个类,其中许多字段都使用配置文件中的数据进行初始化。 Resharper等通常建议应用static readonly修饰符。
我的理解是,static关键字会导致变量存储在堆栈中,而不是堆中。因此,我开始想知道具有大量静态字段是否存在内存使用方面的影响。我搜索了一下,最好的结果是这篇关于静态字符串的文章static strings,其中提到(重点是我的):
当您在字符串上使用static关键字时,表示您只需要一个字符串引用,该引用可以指向一个对象。如果您的程序中有许多字符串值,则不要选择static关键字。
但不幸的是,它没有解释原因。
因此,我目前的最佳猜测是,使用static修饰符可以获得性能提升,因为涉及到指针,但您不应该自由地使用它们,因为它可能会对内存施加压力,因为垃圾收集器永远不会将它们清除?这准确吗?

当你说“许多”字段时,是指十几个或二十个,还是像数千个那样? - Servy
@Servy 大约十几个。我知道在服务器上通常不会有问题,但在树莓派上可能会有问题。 - personaelit
1个回答

8

糟糕,这篇文章写得真的很糟糕。

基本上,他们试图表达一个相对简单的概念:当你使用static关键字时,你只会得到一个变量,而当你省略它时,你会得到每个实例一个变量。变量是静态的,而不是字符串。

至于字符串的内存存储,所有字符串都存储在堆上,从不存储在栈上。唯一具有特殊存储的字符串称为内部化字符串,这是一个完全不适用于此问题的问题。

至于你最后的评论,具有长生命周期的字符串是GC能够处理的完全正常的事情,一旦它们存活了一段时间而没有被删除,它们就会被移到一个不会对性能产生太大影响的角落。


感谢回答。那么,对于配置文件中的内容,使用 static readonly 完全是合适的,因为一个变量的对象是理想的,我理解没错吧?不过,你知道为什么他们会说“如果程序中有很多字符串值”,就不要使用 static 吗? - personaelit
是的,对于配置值来说,静态只读似乎是合理的选择。至于“在程序中有许多字符串值”这一点,我只能猜测那个人可能要么对此感到困惑,要么是在说如果您需要跟踪许多字符串,您将需要使用实例变量来允许您在运行时扩展系统中的字符串数量,因为每个静态字段只能保存一个字符串引用。 - Kyle Sletten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接