C#如何存储字符串

时间:2014-04-05 10:24:36

标签: c#

我想了解类似" 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中吗?

4 个答案:

答案 0 :(得分:6)

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

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

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

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

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

答案 1 :(得分:0)

在示例2中,您将在第一行创建单个字符串。然后,您只需将引用传递给这3个标签。正如你所说,它仍然是内存中的单个对象。但是,由于字符串在C#中是不可变的,因此为radLabel2.Text指定一个新字符串不会改变其他字符串的值,而是会创建一个新字符串。

答案 2 :(得分:0)

  

我认为虽然它们是相同的,但却创造了三个地方   它们在RAM中存储它们。

字符串被实习

当它们是相同的字符串常量时,只保留一个副本。这意味着在你的第一个例子中只有一个“你好”。

答案 3 :(得分:0)

宣布

   radLabel1.Text="Hello";

它在内存中的某个位置创建一个值为Hello的临时字符串,并将值传递给radLabel.text。对于radLabel2.Text和radLabel3.text,程序stil创建temp 2和temp 3来存储“Hello”。因为没有什么可以告诉程序他们是一样的。

但是,当你宣布

   string strTemp = "Hello";

它在内存中创建一个字符串(当然),但与“Hello”不同。因为它们为它创建了一个名称。这类似于计算机的桌面快捷方式。因此,当您使用它时,您只需调用快捷方式,它会绕过创建新字符串的进度,因为该值已经定义。

希望你理解