gpt4 book ai didi

C# 如何存储字符串

转载 作者:行者123 更新时间:2023-12-02 14:14:08 25 4
gpt4 key购买 nike

我想了解像“Hello World”这样的字符串值存储在哪里或如何存储。

例如:

示例1:

radLabel1.Text = "Hello";
radLabel2.Text = "Hello";
radLabel3.Text = "Hello";

示例2:

string strTemp = "Hello";
radLabel1.Text = strTemp;
radLabel2.Text = strTemp;
radLabel3.Text = strTemp;

我知道第二种方法最有用,我正在这样做,但我想知道示例 1 的字符串如何存储在 RAM 中。我认为虽然它们是相同的,但在 RAM 中为它们创建了三个位置来存储它们。但在示例 2 中,仅为示例 2 的字符串创建一个位置,并使用该位置的地址进行访问。我对吗 ?你能解释一下这个或在 RAM 中存储变量吗?

最佳答案

常用的术语是字符串文字被“保留”。这是一个毫无意义的术语,并不能很好地描述真正发生的事情。

.NET 程序集包含两部分数据:元数据和 IL。元数据主要用于描述程序集中的类型并包含资源。 IL 是您编写的代码,已翻译为中间语言格式。

元数据部分有 5 个表,其中之一称为“字符串表”。高度描述了它所包含的内容,这就是存储“Hello”字符串的位置。它的格式已经与字符串通常存储在垃圾收集堆中的方式相同,但在对象 header 中带有一个额外的标志,表明它是字符串文字并且不存储在堆中。

程序集内容通过内存映射文件映射到虚拟内存中,与 .NET System.IO.MemoryMappedFiles.MemoryMapFile 类完全相同。 strTemp 对象引用将由抖动发出的单个 MOV 指令初始化,并存储直接指向文件映射 View 中字符串表条目的指针。当您的程序第一次实际使用字符串内容时,操作系统页面错误会确保该字符串出现在 RAM 中。

每当执行收集时,垃圾收集器都会找到 strTemp 对象引用。但只会忽略引用,对象 header 中的标志表示它应该忽略该引用,因为字符串对象实际上并未存储在垃圾收集堆中。这就是“实习”的真正含义。

关于C# 如何存储字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22879594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com