在C#中浅层复制内容时,字符串如何工作?

dan*_*ine 18 .net c# shallow-copy

字符串被认为是引用类型,但可以像值一样.当浅层手动或使用MemberwiseClone()复制某些内容时,如何处理字符串?它们是否被分开并与副本和主人隔离?

stu*_*ith 46

字符串是引用类型.但是它们是不可变的(它们不能被更改),因此如果它们按值复制或通过引用复制它们并不重要.

如果它们被浅层复制,那么将复制引用...但是您无法更改它们,因此您不能同时影响两个对象.

  • 这是否意味着可以执行仅包含字符串成员的对象的浅层克隆? (5认同)
  • ...这也解释了为什么 String.Replace 必须返回一个新字符串,而不是更改字符串。 (3认同)

Jon*_*eet 26

考虑一下:

public class Person
{
    string name;
    // Other stuff
}
Run Code Online (Sandbox Code Playgroud)

如果你调用MemberwiseClone,你最终会得到两个单独的Person实例,但是它们的name变量虽然不同,但它们具有相同的值 - 它们将引用相同的字符串实例.这是因为它是一个浅层克隆.

如果你在其中一个实例中更改了名称,那么这不会影响另一个实例,因为这两个变量本身是分开的 - 你只是改变其中一个变量的值来引用另一个字符串.


Mar*_*ell 6

你只是复制一个引用(想想"指针"); 两个引用是分开的(但碰巧具有相同的值),但只有一个字符串对象.