最近我一直在了解字符串内部池的工作原理。然而,我还没有找到这个问题的答案。
如果我声明一个常量字符串变量,比如
如果我声明一个常量字符串变量,比如
const string STR = "foo";
,这个字符串也会被添加到内部池中吗?为了澄清事情... CLR与字符串驻留无关。驻留是一个编译时概念,而CLR中的 R 表示运行时。
此外,字符串变量不会被驻留。字符串 字面值 会被驻留。字面值是指右侧的内容,例如:
var variable = "This is a literal.";
当编译器注意到您的代码中有字符串文字时,它必须将其添加到嵌入在程序集中的资源表中。添加时,它会检查它是否已经存在,如果存在,则只使用现有条目。一旦编译完成,整个表格将被发射到程序集中,在运行时可以由您的代码读取。
你可以找到:
const string STR = "foo";
string internedFoo = String.IsInterned("foo");
if (internedFoo != null) // yes it is !