C#参考问题
为什么b.b不会像f.f一样更改为“a2” 谢谢C#参考问题,c#,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"; Co
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; }
}
Boo.b
和Foo.f
是字符串,而不是指向字符串的指针。将
Foo.f
赋值给Boo.b
将Foo.f
的值赋值给Boo.b
。完成任务后,他们就独立了。更改Foo.f
不会更改Boo.bBoo.b
和Foo.f
是字符串,而不是字符串指针。
将Foo.f
赋值给Boo.b
将Foo.f
的值赋值给Boo.b
。完成任务后,他们就独立了。更改Foo.f
不会更改Boo.b
为什么?你不能改变它。仅仅因为您在过去将b.b设置为f.f,并不意味着它将继续对其进行任何更改
您设置的是一个值,而不是一个引用。为什么要设置?你不能改变它。仅仅因为您在过去将b.b设置为f.f,并不意味着它将继续对其进行任何更改
您设置的是一个值,而不是一个引用。下面是一段简单的代码,演示了我认为您希望看到的内容:
string x = "hello";
string y = x;
x = "there";
此时,您似乎希望y
在“那里”
。但是x
和y
是完全独立的变量-第二个变量中的赋值仅将x
(对字符串“hello”的引用)的值复制到y
。第三行为x
(对字符串“there”的引用)指定不同的值-它不会更改y
的值,该值仍然是字符串“hello”的引用
您的示例更为复杂,因为它使用具有自动实现属性的单独类型,但基本概念是相同的。下面是一段简单的代码,演示了我认为您希望看到的内容:
string x = "hello";
string y = x;
x = "there";
此时,您似乎希望y
在“那里”
。但是x
和y
是完全独立的变量-第二个变量中的赋值仅将x
(对字符串“hello”的引用)的值复制到y
。第三行为x
(对字符串“there”的引用)指定不同的值-它不会更改y
的值,该值仍然是字符串“hello”的引用
您的示例更为复杂,因为它使用具有自动实现属性的单独类型,但基本概念是相同的。在.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"
有关更多信息,请查看此问题:
当然,其他课程也是如此
Car c = new Car();
c.Name = "Ford";
Car d = c;
//d.Name == "Ford";
d = new Car();
d.Name = "Volvo";
//c.Name is still "Ford"
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"
有关更多信息,请查看此问题:
当然,其他课程也是如此
Car c = new Car();
c.Name = "Ford";
Car d = c;
//d.Name == "Ford";
d = new Car();
d.Name = "Volvo";
//c.Name is still "Ford"
实际上,Boo.b和Foo.F是对字符串的引用(指针)。不是在OP认为的意义上,这就是为什么我没有用那个词而是用“指针”这个词。实际上,Boo.b和Foo.F是对字符串的引用(指针)。不是在OP认为的意义上,这就是为什么我没有用那个词而是用“指针”这个词。