C#参考问题

时间:2011-05-18 09:13:25

标签: c#

为什么 b.b 不会像f.f那样更改为“a2”?

感谢。

public class Test
{
    public static void Main()
    {
        Foo f = new Foo
        {
            f = getStr()
        };

        Boo b = new Boo
        {
            b = f.f
        };


        f.f = "a2";

        Console.WriteLine(f.f);
        Console.WriteLine(b.b);
    }

    public static string getStr()
    {
        string a = "a1";
        return a;
    }
}

public class Foo
{
    public string f { get; set; }
}

public class Boo
{
    public string b { get; set; }
}

4 个答案:

答案 0 :(得分:3)

这是一段更简单的代码,展示了我认为您期望看到的内容:

string x = "hello";
string y = x;
x = "there";

此时您似乎期望y"there"。但xy完全是独立变量 - 第二个中的赋值仅将x(对字符串“hello”的引用)的值复制到y。第三行将不同的值分配给x(对字符串“there”的引用) - 它不会更改y的值,这仍然是指示对象一个字符串“你好”。

您的示例更复杂,因为它使用具有自动实现属性的单独类型 - 但基本概念是相同的。

答案 1 :(得分:1)

Boo.bFoo.f是字符串,而不是指向字符串的指针 将Foo.f分配给Boo.b会将Foo.f的值分配给Boo.b。完成任务后,他们是独立的。更改Foo.f不会更改Boo.b

答案 2 :(得分:1)

.NET中的字符串是不可变的,这意味着,您不是发送引用,而是发送值。

在.NET的其他类中,您正在传递引用。像这样:

Car c = new Car();
c.Name = "Ford";
var d = c;
d.Name = "Volvo";
c.Name; //Volvo

但是在字符串中,它的工作原理如下:

string s = "Hey";
string c = s;
c = "World!";
//s is still "Hey"

请查看此问题以获取更多信息:Why .NET String is immutable?

当然,它与其他类一样。

Car c = new Car();
c.Name = "Ford";
Car d = c;
//d.Name == "Ford";
d = new Car();
d.Name = "Volvo";
//c.Name is still "Ford"

答案 3 :(得分:0)

为什么会这样?你没有改变它。仅仅因为你在过去将b.b设置为f.f,并不意味着它会随着任何变化继续使用它。

您设置了一个值,而不是参考。