object reference = string reference; 换一个不影响另一个?

use*_*870 4 c#

string name = "bob";
object obj = name; 
obj = "joe";
Console.WriteLine(name);
Run Code Online (Sandbox Code Playgroud)

我对名字打印bob有点困惑.如果string和object都是引用类型,那么在"obj = name"赋值之后,它们是否应该指向堆上的同一块内存?谢谢你的任何澄清.

编辑:StackUnderflow的例子提出了另一个相关的问题.

MyClass myClass1 = new MyClass();
MyClass myClass2;
myClass1.value = 4;
myClass2 = myClass1;
myClass2.value = 5;  // myClass1 and myClass2 both have 5 for value
Run Code Online (Sandbox Code Playgroud)

当两个都是类引用时会发生什么?为什么它不能以相同的方式工作,因为我可以通过一个引用更改类字段,它反映在另一个引用中.类变量也应该是引用.刺痛是不可改变的吗?

Ree*_*sey 6

在"obj = name"赋值之后,它们不应该指向堆上的同一块内存

是.它们都引用相同的字符串实例.您可以通过以下方式查看:

bool sameStringReference = object.ReferenceEquals(obj, name); // Will be true
Run Code Online (Sandbox Code Playgroud)

但是,只要你这样做:

obj = "joe";
Run Code Online (Sandbox Code Playgroud)

你正在改变这个,所以obj现在引用一个不同的字符串. name但是,仍然会引用原始字符串,因为您尚未重新分配它.

如果你这样做:

sameStringReference = object.ReferenceEquals(obj, name); // Will be false
Run Code Online (Sandbox Code Playgroud)

在这一点上这将是错误的.


Mar*_*lon 5

(由于OP陈述了C++背景):

C#中的引用与C++中的引用不同,它们更像指针.在C#中,它们在初始化时不会"绑定",因此赋值运算符(=)将分配新引用而不是修改原始对象.

在C++中:

std::string name = "bob";
std::string& obj = name; // now bound to 'name'
obj = "joe"; // name is directly affected
std::cout << name; // prints "joe"
Run Code Online (Sandbox Code Playgroud)

在C#中:

string name = "bob";
string obj = name; // both reference "bob"
obj = "joe"; // obj now references "joe", and name still references "bob"
Console.WriteLine(name); // prints "bob"
Run Code Online (Sandbox Code Playgroud)