如果我有这个:
string str = "string";
我们可以说在堆上创建了一个 string
类型的对象吗
包含 "string"
?
或
由于 interning,CLR 是否将该文字创建为实习生
str
对象中引用的池?
所以,基本上,形象地说,这是正确的吗:
str --> [ methods, fields, ..., "string"]
或者这是正确的吗?
str --> [ methods, fields, ..., ---> "string"]
其中 [ ]
代表对象。
最佳答案
你真正想问的是
is the interned string stored as a member of the string class?
我还没有找到确定的来源来证实这一点,但我很确定驻留字符串是由 CLR 在字符串类的内存范围之外维护的。这由 source for String.Intern
表示,调用 Thread
类的方法:
public static String Intern(String str) {
if (str==null) {
throw new ArgumentNullException("str");
}
return Thread.GetDomain().GetOrInternString(str);
}
如果实习影响了 string
类的内存占用,我希望 Intern
函数调用 string
类中的方法,而不是而不是调用 Thread
。
但是,这是一个实现细节(因为它不是我能找到的 ECMA-335 standard 的一部分)并且在规范的不同实现之间可能有所不同。
关于c# - 字符串文字和内存表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33872929/