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

时间:2012-06-16 01:25:02

标签: c#

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

我对名字打印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

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

4 个答案:

答案 0 :(得分:6)

  

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

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

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

然而,只要你这样做:

obj = "joe";

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

如果你这样做:

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

此时这将是假的。

答案 1 :(得分: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"

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

答案 2 :(得分:1)

不,您只是将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"

答案 3 :(得分:1)

赋值和对变量进行操作之间存在差异。如果你有这个:

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指向的对象。)