对象引用 = 字符串引用;更改为一个不会影响另一个

本文关键字:一个 另一个 影响 引用 字符串 对象引用 | 更新日期: 2023-09-27 18:37:19

string name = "bob";
object obj = name; 
obj = "joe";
Console.WriteLine(name);

我对名称如何打印鲍勃有点困惑。如果字符串和对象都是引用类型,它们不应该在"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

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

对象引用 = 字符串引用;更改为一个不会影响另一个

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

是的。 它们都引用同一个字符串实例。 您可以通过调用以下内容来查看以下内容:

bool sameStringReference = object.ReferenceEquals(obj, name); // Will be true

但是,一旦您这样做:

obj = "joe";

您正在更改此设置,以便obj现在引用不同的字符串。 但是,name仍将引用原始字符串,因为您尚未重新分配它。

如果您随后执行以下操作:

sameStringReference = object.ReferenceEquals(obj, name); // Will be false

在这一点上,这将是错误的。

(因为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"

在 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"

不,您只是将obj引用重新分配给"joe"字符串对象。 字符串是不可变的,因此无法以这种方式更改它们。 你能做的最好的事情就是用你自己的类包装name

public class MyName
{
    public string Name { get; set; }
}
MyName firstName = new MyName() { Name = "bob" };
MyName secondName = name;
secondName.Name = "joe";
Console.WriteLine(firstName.Name) //outputs "joe"

赋值和作用于变量是有区别的。如果你有这个:

public class A { public string Name; }
...
var orig = new A { Name = "bob" };
var obj = orig;
obj.Name = "joe";
Console.WriteLine(orig.Name); //"joe"

在这里,您将修改obj指向的对象(而不是修改obj指向的对象)。