最近,我一直在阅读字符串实习池的工作方式。但是我找不到这个问题的答案。
如果我声明一个像 const string STR = "foo";
这样的常数字符串变量,是否也会添加到实习表中?
只是为了清除事物... CLR不参与字符串Interning。实习是一个编译时概念,CLR中的R是运行时。
此外,字符串变量未被实施。字符串文字被实施。字符串文字是右边的东西,例如
var variable = "This is a literal.";
编译器注意到您的代码中有字符串文字时,它必须将其添加到嵌入在组装中的资源表中。当它添加时,它会检查是否已经存在,如果确实存在,则仅使用现有条目。汇编完成后,将整个表排放到程序集中,可以在运行时通过您的代码阅读。
您可以找到:
const string STR = "foo";
string internedFoo = String.IsInterned("foo");
if (internedFoo != null) // yes it is !
在您可以找到的任何版本的框架中,答案都是肯定的,但它取决于实现。并且存在一个晦涩的环境来关闭。