在下面的代码中,对cpy
值的更改不会影响ori
值,因此字符串的行为不像引用类型:
string ori = "text 1";
string cpy = ori;
cpy = "text 2";
Console.WriteLine("{0}", ori);
但是,一个类有不同的行为:
class WebPage
{
public string Text;
}
// Now look at reference type behaviour
WebPage originalWebPage = new WebPage();
originalWebPage.Text = "Original web text";
// Copy just the URL
WebPage copyOfWebPage = originalWebPage;
// Change the page via the new copy of the URL
copyOfWebPage.Text = "Changed web text";
// Write out the contents of the page
// Output=Changed web text
Console.WriteLine ("originalWebPage={0}",
originalWebPage.Text);
有人可以告诉我为什么类和字符串之间的行为不同,而其中两个是引用类型?
答案 0 :(得分:5)
尽管strings
是不可变的,但这种情况与此无关。当您为引用类型分配新引用时,您将丢弃旧引用。在第二个示例中,您正在更改对象的属性,因为它们指向同一位置,这两个属性都会受到影响。
但是当你做的时候
cpy = "text 2";
这意味着创建一个新字符串并将其存储到cpy
中并丢弃cpy
的旧引用。
答案 1 :(得分:2)
类的行为与字符串完全相同,你只是在两个例子中做了同样的事情。
WebPage originalWebPage = new WebPage();
originalWebPage.Text = "Original web text";
WebPage copyOfWebPage = originalWebPage;
//Overwrite the copy variable just like you did before
copyOfWebPage = new WebPage();
copyOfWebPage.Text = "Modified web text";
Console.WriteLine ("originalWebPage={0}", originalWebPage.Text);
Console.WriteLine ("copyOfWebPage={0}", copyOfWebPage.Text);
类的例子让你更明显地发生了什么,当你做了
string cpy = ori;
cpy = "text 2";
您将ori
的文字复制到cpy
,然后您立即将复制的"text 2"
中的值复制到cpy
,您实际上从未真实地"改性"对象cpy
引用的值,你只是指向一个新对象。