调用ToUpper()等后,旧的字符串对象是否会被垃圾回收?

Phi*_*l C 3 c# garbage-collection

这是否会导致旧的字符串对象被垃圾收集,或者它仍然是对同一对象的相同引用?

    string str = "Hello World!"; 
    str = str.ToUpper();
Run Code Online (Sandbox Code Playgroud)

我理解GC的作用及其不可预测性.

Jör*_*tag 6

这是否会导致旧的字符串对象被垃圾回收

我们不能说.有两个原因:

  1. 我们不知道是否还有其他对字符串的引用.如果对字符串有其他引用,则该字符串将不符合收集条件.注意:如果您显示的代码是整个代码,则不会有其他引用.
  2. 即使字符串符合垃圾收集条件,也无法知道垃圾收集器何时运行.我们甚至不知道垃圾收集器是否会运行.

或者它仍然是同一个对象的相同引用?

不,您创建了一个新字符串.文件 明确指出(大胆强调我的):

返回转换为大写的此字符串的副本.

注意:此方法不会修改当前实例的值.相反,它返回一个新字符串,其中当前实例中的所有字符都转换为大写.

此外,string是不可变的,所以无论如何它都无法改变.


Ous*_* D. 5

是的,旧的字符串对象将最终被垃圾收集,GC将发现没有更多对该对象的引用.

经过一些研究,似乎字符串文字"Hello World!"是默认实例,所以即使不再提及它们,也不会像@Henk Holterman在评论中提到的那样进行垃圾收集.

这是因为字符串文字是程序集的一部分,并且没有垃圾收集.

所以,我现在将上面的段落改为:

是的,旧的字符串对象将被垃圾收集,如果它不是最终的字符串文字,GC将发现没有更多的对该对象的引用

但是, GC这样做时,这是不确定的.

  • 像_"Hello World!"这样的_string constant_根本不会被完全联合起来. (2认同)