string不像引用类型

时间:2014-12-15 14:30:46

标签: c#

在下面的代码中,对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);

有人可以告诉我为什么类和字符串之间的行为不同,而其中两个是引用类型?

2 个答案:

答案 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);

Run this example

类的例子让你更明显地发生了什么,当你做了

string cpy = ori;
cpy = "text 2";

您将ori的文字复制到cpy,然后您立即将复制的"text 2"中的值复制到cpy,您实际上从未真实地"改性"对象cpy引用的值,你只是指向一个新对象。