【发布时间】:2021-07-21 12:51:36
【问题描述】:
由于字符串是dotnet中的ref类型,当我们更新变量x时,y也应该有更新? (因为它指的是 x 的值)。下面给出的示例程序,当 x 更新时,y 的值如何不改变?
public void assignment()
{
string x= "hello";
string y=x; // referencing x as string is ref type in .net
x = x.Replace('h','j');
Console.WriteLine(x); // gives "jello" output
Console.WriteLine(y); // gives "hello" output
}
【问题讨论】:
-
不,基本上。改变一个变量的值(不影响其他变量)和改变一个对象的内容是有区别的。见jonskeet.uk/csharp/references.html 和stackoverflow.com/a/32010236/22656
-
您在谈论可变与不可变。 String 是不可变的,它始终保持相同的值。字符串也是引用类型,它没有默认分配大小。
-
@Bizhan:这与不变性无关。即使字符串是可变的,改变一个变量的值也不会改变另一个变量。 (例如,假设我们使用
StringBuilder而不是string,并且有问题的行是x = null;- 这不会使y为空。) -
@JonSkeet 我认为它是也是关于不变性的,因为例如
StringBuilder.Replace发生变异并返回自身,所以x = x.Replace(...)也会改变y中的值。 -
@Charlieface:这正是我没有在我的示例中使用
Replace的原因。假设string实际上是可变的,但Replace的当前行为是返回一个新字符串而不是修改现有字符串。 (例如,也许会有一个ReplaceInExistingObject方法会改变它。)这个问题中的行为根本不会改变。