最近我一直在阅读字符串实习生池的工作方式。但是我找不到这个问题的答案。
如果我声明一个常量字符串变量,例如const string STR = "foo";
,这是否还会添加到内部表中?
答案 0 :(得分:1)
只是要清理一下... CLR不参与字符串实习。实习是一个编译时概念,CLR中的R是运行时。
此外,不对字符串变量进行实习。字符串 literals 被屏蔽。字符串文字是右边的内容,例如
var variable = "This is a literal.";
当编译器注意到您的代码中包含字符串文字时,它必须将其添加到嵌入在程序集中的资源表中。添加它时,它会检查它是否已经存在,如果存在,则仅使用现有条目。编译完成后,整个表将被发送到程序集中,您的代码可在运行时在其中读取它。
答案 1 :(得分:1)
您可以找到:
const string STR = "foo";
string internedFoo = String.IsInterned("foo");
if (internedFoo != null) // yes it is !
在您可以找到的任何版本的框架中,答案都是肯定的,但它取决于实现。并且有obscure setting要关闭实习。