首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对象引用=字符串引用;更改其中一个不会影响另一个?

对象引用=字符串引用;更改其中一个不会影响另一个?
EN

Stack Overflow用户
提问于 2012-06-16 09:25:02
回答 4查看 1.1K关注 0票数 3
代码语言:javascript
复制
string name = "bob";
object obj = name; 
obj = "joe";
Console.WriteLine(name);

我有点搞不懂name将如何打印bob。如果string和object都是引用类型,那么在"obj = name“赋值之后,它们不应该指向堆上的同一块内存吗?感谢您的任何澄清。

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

代码语言:javascript
复制
MyClass myClass1 = new MyClass();
MyClass myClass2;
myClass1.value = 4;
myClass2 = myClass1;
myClass2.value = 5;  // myClass1 and myClass2 both have 5 for value

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-06-16 09:28:47

名称不应该指向堆中“

=”赋值后的相同内存块

是。它们都引用相同的string实例。您可以通过调用以下命令来查看:

代码语言:javascript
复制
bool sameStringReference = object.ReferenceEquals(obj, name); // Will be true

然而,一旦你这样做了:

代码语言:javascript
复制
obj = "joe";

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

如果你这样做了:

代码语言:javascript
复制
sameStringReference = object.ReferenceEquals(obj, name); // Will be false

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

票数 6
EN

Stack Overflow用户

发布于 2012-06-16 09:37:57

(由于OP声明了C++背景):

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

在C++中:

代码语言:javascript
复制
std::string name = "bob";
std::string& obj = name; // now bound to 'name'
obj = "joe"; // name is directly affected
std::cout << name; // prints "joe"

在C#中:

代码语言:javascript
复制
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"
票数 5
EN

Stack Overflow用户

发布于 2012-06-16 09:27:52

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

代码语言:javascript
复制
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"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11060042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档