C#如何存储字符串

arn*_*nes 2 c#

我想知道在哪里或如何存储由"Hello World"编写的字符串值.

例如:

例1:

radLabel1.Text = "Hello";
radLabel2.Text = "Hello";
radLabel3.Text = "Hello";
Run Code Online (Sandbox Code Playgroud)

例2:

string strTemp = "Hello";
radLabel1.Text = strTemp;
radLabel2.Text = strTemp;
radLabel3.Text = strTemp;
Run Code Online (Sandbox Code Playgroud)

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

Han*_*ant 6

徘徊的通常术语是字符串文字是"实习".这是一个毫无意义的术语,并没有描述那些真正发生的事情.

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

元数据部分有5个表,其中一个称为"字符串表".高度描述它包含的内容,即存储"Hello"字符串的位置.它的格式与通常存储在垃圾收集堆中的字符串的方式相同,但在对象标头中有一个额外的标志,表示它是一个字符串文字,而不是存储在堆中.

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

垃圾收集器在执行集合时将找到strTemp对象引用.但是只会忽略引用,对象头中的标志表示它应该是因为字符串对象实际上并不存储在垃圾收集堆中.这实际上是"实习"的意思.