C#将指向引用类型的变量分配给另一个变量,后一个变量中存储了什么?
我试图理解当将一个变量C#将指向引用类型的变量分配给另一个变量,后一个变量中存储了什么?,c#,types,parameter-passing,pass-by-reference,C#,Types,Parameter Passing,Pass By Reference,我试图理解当将一个变量a分配给一个新变量b时会发生什么,该变量已经存储了对对象实例MyClass的引用。 例如 我以为b中存储的值应该是a的地址,它是2,但当我输出b的值时,结果实际上是1。 e、 g 输出是 NEW NAME //a.Name some name //b.Name 我希望这两个变量的名称都会更改,因为我认为b正在存储指向a的指针。但是似乎b存储的是a的值,而不是它的地址 提前感谢(作者试图用指针的术语来解释,但是,这似乎有太复杂的事情) 调用setName(ref a,
a
分配给一个新变量b
时会发生什么,该变量已经存储了对对象实例MyClass
的引用。
例如
我以为b
中存储的值应该是a
的地址,它是2,但当我输出b
的值时,结果实际上是1。
e、 g
输出是
NEW NAME //a.Name
some name //b.Name
我希望这两个变量的名称都会更改,因为我认为b
正在存储指向a
的指针。但是似乎b
存储的是a
的值,而不是它的地址
提前感谢(作者试图用指针的术语来解释,但是,这似乎有太复杂的事情)
调用setName(ref a,“NEW NAME”)
在功能上等同于将setName()的主体内联到实例中,替换为a
:
var a=newmyclass(“某个名称”);
var b=a;
a=新MyClass(“新名称”);
Console.WriteLine(a.Name);
Console.WriteLine(b.Name);
现在很清楚,在这种情况下,b.Name
的值没有理由改变。添加函数setName()
,其中a
通过引用传递,对b
的结果没有影响,谢谢您的回复,所以。。。当将a
分配给b
时,我们将a
的值分配给b
而不是a
的内存位置/引用?我的意思是,结果也表明了这一点,但我无法找到这种行为发生的原因,因为我假设a
仍然是引用类型的变量。可能是我阅读文档时的疏忽。@ChenL不,您不是在复制数据,而是在将a
分配给b
时复制了地址。如果“复制地址”是指将a
的地址复制到b
的值,那么,由于b
存储a
的地址,对a
的值的更改是否也应该更改b
的值?对不起,这有点让人困惑。@ChenL我知道这很让人困惑。您必须将地址本身视为其自身的价值。一旦你接受了这一点,那么就更容易理解为什么b
的地址不改变,而a
的地址改变了。哦,所以b
与a
的原始地址共享相同的内存地址。现在说得通了。我以为b
会有不同的内存地址,只保存a
的内存地址,谢谢@Patrick Roberts。
setName(ref a, "NEW NAME");
public void setName (ref MyClass instance, string name)
{
instance = new MyClass(name)
}
Console.WriteLine(a.Name);
Console.WriteLine(b.Name);
NEW NAME //a.Name
some name //b.Name