我知道C#中的string
是不可变的,即当我更改string
变量的值时,会创建一个具有相同名称的新string
变量,并使用新值和较旧的一个由GC收集。我是对的吗?
string s1 = "abc";
s1 = s1.Substring(0, 1);
如果我说的是对的,那么我怀疑是否创建了新的string
,那么它是否在相同的内存位置创建?
答案 0 :(得分:9)
如果创建了一个新字符串,那么它是在同一个内存位置创建的吗?
不,在单独的内存中创建单独的string
对象。
然后,您将使用对新创建的字符串的引用替换s1
的值。 可能会或可能不会意味着原始字符串可以被垃圾收集 - 这取决于是否有其他内容引用它。在字符串常量的情况下(如在您的示例中,使用字符串文字)我怀疑无论如何都不会被垃圾收集,尽管它是一个实现细节。
如果你有:
string text = "original";
text = text.Substring(0, 5);
text = text.Substring(0, 3);
然后第一次调用Substring
创建的中间字符串将有资格进行垃圾回收,因为没有其他内容可以引用它。这并不意味着它会立即被垃圾收集,但这并不意味着它的内存将被重用于最后一行创建的字符串。