CLR 实习生字符串常量吗?
Does the CLR intern string constants?
最近我一直在研究字符串实习生池的工作原理。但是我一直没能找到这个问题的答案。
如果我声明一个像 const string STR = "foo";
这样的常量字符串变量,它也会被添加到实习生 table 中吗?
澄清一下...CLR 不参与字符串驻留。 Interning是编译期的概念,CLR中的R是运行time.
此外,字符串变量不会被驻留。字符串 文字 被驻留。字符串文字是右边的东西,例如
var variable = "This is a literal.";
当编译器注意到您的代码中有字符串文字时,它必须将其添加到嵌入在您的程序集中的资源 table。当它添加它时,它会检查它是否已经存在,如果存在,它只使用现有的条目。编译完成后,整个 table 被发送到程序集中,您的代码可以在 运行 时读取它。
你可以查到:
const string STR = "foo";
string internedFoo = String.IsInterned("foo");
if (internedFoo != null) // yes it is !
在您可以找到的任何版本的框架中,答案都是肯定的,但这取决于实现。并且存在一个 obscure setting 来关闭实习。
最近我一直在研究字符串实习生池的工作原理。但是我一直没能找到这个问题的答案。
如果我声明一个像 const string STR = "foo";
这样的常量字符串变量,它也会被添加到实习生 table 中吗?
澄清一下...CLR 不参与字符串驻留。 Interning是编译期的概念,CLR中的R是运行time.
此外,字符串变量不会被驻留。字符串 文字 被驻留。字符串文字是右边的东西,例如
var variable = "This is a literal.";
当编译器注意到您的代码中有字符串文字时,它必须将其添加到嵌入在您的程序集中的资源 table。当它添加它时,它会检查它是否已经存在,如果存在,它只使用现有的条目。编译完成后,整个 table 被发送到程序集中,您的代码可以在 运行 时读取它。
你可以查到:
const string STR = "foo";
string internedFoo = String.IsInterned("foo");
if (internedFoo != null) // yes it is !
在您可以找到的任何版本的框架中,答案都是肯定的,但这取决于实现。并且存在一个 obscure setting 来关闭实习。