为什么 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; }
}
答案 0 :(得分:3)
这是一段更简单的代码,展示了我认为您期望看到的内容:
string x = "hello";
string y = x;
x = "there";
此时您似乎期望y
为"there"
。但x
和y
完全是独立变量 - 第二个中的赋值仅将x
(对字符串“hello”的引用)的值复制到y
。第三行将不同的值分配给x
(对字符串“there”的引用) - 它不会更改y
的值,这仍然是指示对象一个字符串“你好”。
您的示例更复杂,因为它使用具有自动实现属性的单独类型 - 但基本概念是相同的。
答案 1 :(得分:1)
Boo.b
和Foo.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,并不意味着它会随着任何变化继续使用它。
您设置了一个值,而不是参考。