如:如果字符串是不可变的,是否意味着一个值重新分配会创建一个具有相同名称的新字符串对象?
string test = "abcde"; // "abcde"
test = test.Substring(1); //"bcde"
这是否意味着test
第二行是不一样的对象test
在第一行?即编译器创建了一个字符串对象的新实例,并将其称为'test',并将第一个'test'发送到垃圾回收器?
如果是这样,这是我需要关注的任何事情吗?
感谢
如:如果字符串是不可变的,是否意味着一个值重新分配会创建一个具有相同名称的新字符串对象?
string test = "abcde"; // "abcde"
test = test.Substring(1); //"bcde"
这是否意味着test
第二行是不一样的对象test
在第一行?即编译器创建了一个字符串对象的新实例,并将其称为'test',并将第一个'test'发送到垃圾回收器?
如果是这样,这是我需要关注的任何事情吗?
感谢
这正是发生了什么,只是字符串文字拘留,无法再GC'd。
另外,对象没有名称;相反,它将创建一个新的String
实例并使您的变量引用它。
Schabse的答案当然是正确的;然而,我会进一步澄清你的想法。
这是否意味着第二行的测试与第一行的测试不是同一个对象?
是的。 test
是变量的名称。 (请记住,并非所有变量都有名称,但是这个名称有。)变量存储值。 A 参考是一种值。您首先将参考分配给test
的特定字符串。然后在下一行分配一个不同的参考。
编译器创建了一个字符串对象的新实例,并将其称为'test',并将第一个'test'发送到垃圾回收器?
编译器没有这样的事情。 A 编译器是将用一种语言编写的程序翻译成用另一种语言编写的程序的装置。 C#编译器将C#转换为包含MSIL代码和元数据的可移植可执行文件。该代码指示CLR创建字符串。
CLR中,运行该程序片段的情况下,所创建的字符串对象的新实例并把它称为“测试”
否,CLR创建的string
一个新实例并分配参考该实例添加到名为test
的变量中。 实例不是具有名称的东西。存储对实例的引用的变量是具有名称的变量。不要混淆两者!如果我有一个名为的地址簿我的地址簿,并且地址簿中包含地址“华盛顿特区宾夕法尼亚大街1600号的巴里奥巴马”,则该地址的房屋名称仍然是白宫而不是我的地址簿。
CLR创建了一个新的字符串对象实例,为它分配一个引用来测试,它已经包含了一个引用。由于之前引用的对象现在不再被任何根引用,垃圾收集器立即释放它。
编号首先,不需要释放对文字字符串的引用。其次,假设抛出的引用不是字面的,垃圾收集器运行时按照自己的时间表运行。没有要求释放字符串有史以来。当然,当进程终止时 - 如果它结束 - 那么所有的进程内存将被释放。
所以现在我们可以解决您原来的问题:
如果字符串是不可变的,这是否意味着一个价值重新分配创建了相同名称的新字符串对象?
的问题是不连贯的,因为(1)引用语义是完全独立的串是否是不可变的,(2)对象没有名称,变量有名字。你能改说你的问题吗?
这是我需要关注的东西吗?
对C#基础知识的正确理解绝对是你如果想成为C#程序员时应该关注的东西。
非常感谢您的澄清 – rory 2014-09-01 14:26:17
“另外,对象没有名称;相反,它会创建一个新的String实例并使您的变量引用它。”啊,是的,非常好。没有意识到他们永远不会被GC'd。在内存资源方面,我应该关注自己吗? – rory 2014-08-31 20:23:28
@ rory:不;你可能没有字符串**文字**。 – SLaks 2014-08-31 20:27:51