CLR实习字符串常数



最近,我一直在阅读字符串实习池的工作方式。但是我找不到这个问题的答案。

如果我声明一个像 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 !

在您可以找到的任何版本的框架中,答案都是肯定的,但它取决于实现。并且存在一个晦涩的环境来关闭。

最新更新