为什么字符串对象引用不像其他对象引用?

Day*_*One 1 c#

string a = "a";

string b = a;

string a = "c";
Run Code Online (Sandbox Code Playgroud)

为什么字符串b仍然具有值"a"而不是"c"

由于string是一个对象而不是堆栈值类型,这种行为是什么?

谢谢

Ant*_*ram 27

你把变量指向一个新的东西,它与你说的没什么不同

Foo a = new Foo();
Foo b = a;
a = new Foo();
// a no longer equal to b
Run Code Online (Sandbox Code Playgroud)

在此示例中,b指向a最初引用的内容.通过更改值a,a并且b不再引用内存中的同一对象.这与使用a和b的属性不同.

Foo a = new Foo();
Foo b = a;
a.Name = "Bar";
Console.WriteLine(b.Name);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,"酒吧"被写入到屏幕,因为ab仍然引用同一个对象.

  • @Charles:对不起,没有.OP可能认为这与值类型语义有关,但它没有,正如这个答案清楚地表明的那样. (3认同)

Eri*_*ert 21

首先让我说你对变量和数据的选择很差.这使得某人很难说"你的例子中的字符串a ......"因为"a"可能是字符串的内容,或者是包含引用的变量.(它很容易与不定冠词'a'混淆.)

此外,您的代码无法编译,因为它声明变量"a"两次.如果您以一种让他们能够明确回答问题的方式提出问题,您可能会得到更好的答案.

让我们重新开始吧.

我们有两个变量和两个字符串文字.

string x = "hello";
string y = x;
x = "goodbye";
Run Code Online (Sandbox Code Playgroud)

现在的问题是"为什么y等于'你好'而不是'再见'"?

让我们回到基础.什么是变量变量是存储位置.

字符串类型的值是什么?字符串类型的值是对字符串数据的引用..

什么是字符串类型的变量?把它放在一起.string类型的变量是一个存储位置,它保存对字符串数据的引用.

那么,什么是x?存储位置.它的第一个价值是什么?对字符串数据"hello"的引用.

你是什​​么?存储位置.它的第一个价值是什么?字符串数据"hello"的引用,与x相同.

现在我们改变存储位置x的内容以引用字符串数据"goodbye".存储位置y的内容不变; 我们没有设定y.

合理?

为什么字符串对象引用不像其他对象引用?

我否认这个问题的前提.String对象裁判表现得像其他物体裁判.你能举例说明他们不在哪里吗?

  • @Charles:他解释了变量是如何工作的.OP的问题确实表明了对*变量本身*如何工作的误解; 用任何其他类型(值类型*或*引用类型)替换所讨论的代码中的`string` - 考虑这样的事实:代码在任何情况下都不会表现出OP似乎期望的行为 - 你会看到OP很简单. (7认同)