c# - 字符串文字和内存表示

标签 c#

如果我有这个:

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/

相关文章:

c# - 如何保护内置于表单例份验证中的 OWASP A10?

C# 异步调用链式委托(delegate)方法

c# - 在基类和派生类中初始化基类属性

c# - C# 或 VB.net 中的示例仪表板应用程序?

c# - 插入数据库C#连接字符串错误

javascript - Asp.Net MVC 中相同属性的编辑器和下拉列表

c# - 生成的 csv 文件中的换行符让我抓狂

c# - 如何将缓慢移动的可观测值与快速移动的可观测值的最新值结合起来

c# - Xamarin.Android nuget 包引用 System.Web

c# - 使用 httpclient 在 C# 中获取 API 数据