Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 字符串文字和内存表示_C# - Fatal编程技术网

C# 字符串文字和内存表示

C# 字符串文字和内存表示,c#,C#,如果我有这个: string str = "string"; 我们可以说堆上创建了一个string 包含“字符串” 或 由于实习,CLR是否将该文字创建到实习中 在str对象中引用的池 那么,基本上,这个比喻是正确的: str --> [ methods, fields, ..., "string"] 或者这是正确的 str --> [ methods, fields, ..., ---> "string"] 其中,[]表示对象。根据: 公共语言运行库自动维护一个名为 实

如果我有这个:

string str = "string";
我们可以说堆上创建了一个
string
包含
“字符串”

由于实习,CLR是否将该文字创建到实习中 在
str
对象中引用的池

那么,基本上,这个比喻是正确的:

str --> [ methods, fields, ..., "string"]
或者这是正确的

str --> [ methods, fields, ..., ---> "string"]
其中,
[]
表示对象。

根据:

公共语言运行库自动维护一个名为 实习生池,其中包含每个唯一用户的单个实例 程序中声明的文本字符串常量,以及任何唯一 通过调用Intern以编程方式添加的字符串的实例 方法

字符串不像普通对象那样在堆上创建,以证明这一点——如果创建两个具有相同值的字符串,如

string str = "string";
string anotherStr = "string";
调用
Object.ReferenceEquals(str,anotherStr)
返回
true

您还可以根据以下内容检查字符串是否在字符串池中:

公共语言运行库自动维护一个名为 实习生池,其中包含每个唯一用户的单个实例 程序中声明的文本字符串常量,以及任何唯一 通过调用Intern以编程方式添加的字符串的实例 方法

字符串不像普通对象那样在堆上创建,以证明这一点——如果创建两个具有相同值的字符串,如

string str = "string";
string anotherStr = "string";
调用
Object.ReferenceEquals(str,anotherStr)
返回
true


您还可以检查字符串是否在字符串池中,您真正想问的是

插入的字符串是否存储为string类的成员

我还没有找到一个确定的来源来证实这一点,但我非常确定,被插入的字符串是由CLR在string类的内存范围之外维护的。这由调用
线程
类上的方法表示:

public static String Intern(String str) {
    if (str==null) {
        throw new ArgumentNullException("str");
    }
    return Thread.GetDomain().GetOrInternString(str);
}
如果interning影响了
string
类的内存占用,我希望
Intern
函数调用
string
类中的方法,而不是调用
Thread


然而,这是一个实现细节(因为我找不到它的一部分),在规范的不同实现之间可能有所不同

插入的字符串是否存储为string类的成员

我还没有找到一个确定的来源来证实这一点,但我非常确定,被插入的字符串是由CLR在string类的内存范围之外维护的。这由调用
线程
类上的方法表示:

public static String Intern(String str) {
    if (str==null) {
        throw new ArgumentNullException("str");
    }
    return Thread.GetDomain().GetOrInternString(str);
}
如果interning影响了
string
类的内存占用,我希望
Intern
函数调用
string
类中的方法,而不是调用
Thread

然而,这是一个实现细节(因为我找不到它的一部分),并且在规范的不同实现之间可能有所不同。

根据这一点,可能会使这个问题重复,您创建的
字符串
对象始终在堆上,无论它是否处于内部。当您插入一个字符串时,表(或插入池,其本身位于LOH上)将创建一个新的引用,该引用指向您之前已创建的相同对象(在堆上)。您可以看到,其中还明确提到,当您创建
字符串
对象时,会使用堆上的内存,不管它是否被占用

将字符串的内存放在其他地方并不是什么神奇的事情,可以将其视为现有字符串的查找表,以便在字符串与另一个字符串相同时节省内存

根据这一点,您创建的
string
对象始终位于堆上,无论是否被占用。当您插入一个字符串时,表(或插入池,其本身位于LOH上)将创建一个新的引用,该引用指向您之前已创建的相同对象(在堆上)。您可以看到,其中还明确提到,当您创建
字符串
对象时,会使用堆上的内存,不管它是否被占用


将字符串的内存放在其他地方并不是什么神奇的事情,可以将其视为现有字符串的查找表,以便在字符串与另一个字符串相同时节省内存

当然,你可以为你的研究提供一些证据……这要视情况而定。值
“string”
可能在数据段中,因为它是一个常量,而不是在他不知道从何处查找的堆中。。。为了保持这个问答网站。让他看一下,您是否在询问是否将插入的字符串存储为string类的属性?我非常确定字符串池是由CLR维护的,而不是嵌入到string类中。但是,这可能是一个需要更改的实现细节。据我所知,在手动调用
String.Intern
方法之前,运行时字符串不会被保留。所以,在给实习生打电话之前,我认为第一个案例是正确的;在打电话给第二个案例后,情况就变得正确了。当然,你可以提供一些证据证明你的研究……这要看情况而定。值
“string”
可能在数据段中,因为它是一个常量,而不是在他不知道从何处查找的堆中。。。为了保持这个问答网站。让他看一下,您是否在询问是否将插入的字符串存储为string类的属性?我非常确定字符串池是由CLR维护的,而不是嵌入到string类中。然而,这可能是一个需要更改的实现细节