C# 如果字符串是不可变的,这是否意味着重新分配值会创建具有相同名称的新字符串对象?

C# 如果字符串是不可变的,这是否意味着重新分配值会创建具有相同名称的新字符串对象?,c#,string,object,immutability,C#,String,Object,Immutability,例如: 这是否意味着第二行的test与第一行的test不是同一个对象?ie编译器创建了字符串对象的一个新实例,并将其称为“test”,第一个“test”被发送到垃圾收集器 如果是的话,这是我需要关心的事情吗 谢谢,这正是发生的事情,除了字符串文本是被拘留的,并且永远不能被GC读取 而且,对象没有名称;相反,它会创建一个新的字符串实例,并使您的变量引用它。Schabse的答案当然是正确的;不过,我想进一步澄清你的想法 这是否意味着第二行上的测试与第一行上的测试不是同一对象 对测试是变量的名称。(请

例如:

这是否意味着第二行的
test
与第一行的
test
不是同一个对象?ie编译器创建了字符串对象的一个新实例,并将其称为“test”,第一个“test”被发送到垃圾收集器

如果是的话,这是我需要关心的事情吗


谢谢,这正是发生的事情,除了字符串文本是被拘留的,并且永远不能被GC读取


而且,对象没有名称;相反,它会创建一个新的
字符串
实例,并使您的变量引用它。

Schabse的答案当然是正确的;不过,我想进一步澄清你的想法

这是否意味着第二行上的测试与第一行上的测试不是同一对象

对<代码>测试
是变量的名称。(请记住,并非所有变量都有名称,但此变量有名称。)变量存储值。引用是一种值。首先,将对特定字符串的引用指定给
test
。然后在下一行上指定不同的引用

编译器创建了字符串对象的一个新实例,并将其称为“test”,第一个“test”被发送到垃圾收集器

编译器没有这样做。编译器是将一种语言编写的程序翻译成另一种语言编写的程序的设备。C#编译器将C#转换为包含MSIL代码和元数据的可移植可执行文件。该代码指示CLR创建字符串

CLR在运行此程序片段时,创建了string对象的新实例,并将其称为“test”

否,CLR创建了
string
的新实例,并将该实例的引用分配给名为
test
的变量。实例不是具有名称的对象。存储实例引用的变量是具有名称的对象。不要混淆两者!如果我有一本叫做我的通讯录的通讯录,而通讯录上的地址是“Barry Obama,1600宾夕法尼亚大道,华盛顿特区”,那么在那个地址的房子的名字仍然是白宫,而不是我的通讯录

CLR创建了字符串对象的一个新实例,为其分配了一个引用以进行测试,该引用已包含一个引用。由于以前引用的对象现在不再被任何根引用,垃圾收集器会立即释放它

不需要。首先,不需要释放对文本字符串的引用。第二,假设丢弃的引用不是一个文本,垃圾收集器在运行时按照自己的时间表运行。不需要释放字符串。当然,当进程终止时(如果终止),所有进程内存都将被释放

现在我们可以回答你原来的问题:

如果字符串是不可变的,这是否意味着重新分配值会创建具有相同名称的新字符串对象

这个问题是不连贯的,因为(1)引用语义完全独立于字符串是否不可变,(2)对象没有名称,变量有名称。你能重新措辞你的问题吗

这有什么我需要关心的吗


如果你想成为一名C#程序员,正确理解C#的基本原理绝对是你应该关心的事情。

“而且,对象没有名称;相反,它创建了一个新的字符串实例,并让你的变量引用它。”啊,是的,非常好。没有意识到他们永远都不会被杀。这是我应该关心的关于记忆资源的事情吗?@rory:不是;您可能没有字符串文本的兆字节。
string test = "abcde"; // "abcde"
test = test.Substring(1); //"bcde"