string strMain = "main"; // Store a string, create a reference to it
DoSomething(strMain); // Reference gets copied, copy gets re-pointed
Console.WriteLine(strMain); // The original string is still "main"
永恒不变
让我们改变一下情况。假设我们使用的不是字符串,而是一些可变的引用类型,比如您创建的类。
class MutableThing
{
public int ChangeMe { get; set; }
}
void Main()
{
var objMain = new MutableThing();
objMain.ChangeMe = 5;
Console.WriteLine(objMain.ChangeMe); // it's 5 on objMain
DoSomething(objMain); // now it's 0 on objLocal
Console.WriteLine(objMain.ChangeMe); // it's also 0 on objMain
}
但字符串是不可变的!没有要设置的 ChangeMe属性。您不能像使用 C 样式的 char数组那样在 C # 中执行 strLocal[3] = 'H'; 您必须构造一个全新的字符串。更改 strLocal的唯一方法是将引用指向另一个字符串,这意味着对 strLocal所做的任何操作都不会影响 strMain。该值是不可变的,引用是一个副本。