C#字符串引用类型作为副本传递?

Alb*_*ano 0 c# reference-type

我怀疑与C#"String"引用类型有关.

以下代码:

string s = "lana del rey" 
string d = s;
s = "elvis presley";
Console.Writeline(d);
Run Code Online (Sandbox Code Playgroud)

为什么输出不是"elvis presley"?如果d指向s的相同内存位置?

你能解释一下吗?

我最初问题的更详细解释:

你的所有答案都非常有用.这个常见的代码示例经常用于解释值类型和引用类型之间的区别,这个问题来到我身边:

class Rectangle
{
    public double Length { get; set; }
}

struct Point 
{
    public double X, Y;
}

Point p1 = new Point();
p1.X = 10;
p1.Y = 20;
Point p2 = p1;
p2.X = 100;
Console.WriteLine(“p1.X = {0}”, p1.X);

Rectangle rect1 = new Rectangle
{ Length = 10.0, Width = 20.0 };
Rectangle rect2 = rect1;
rect2.Length = 100.0;
Console.WriteLine(“rect1.Length = {0}”,rect1.Length);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,第二个Console.WriteLine语句将输出:"rect1.Length = 100"

在这种情况下,类是引用类型,struct是值类型.如何使用字符串演示相同的引用类型行为?

提前致谢.

Typ*_*eIA 5

C#中的字符串是不可变的 ; 这意味着他们无法改变.当您说s = "elvis presley"您正在创建新字符串并将其引用分配给s; 这不会影响保存的引用d仍然指向原始字符串.


zer*_*kms 5

它与可变性无关

string s = "lana del rey" 
string d = s;
Run Code Online (Sandbox Code Playgroud)

这里有2个变量s,d指的是内存中的同一个对象.

s = "elvis presley";
Run Code Online (Sandbox Code Playgroud)

在语句的右侧部分,新对象被分配并初始化"elvis presley"并分配给s.所以现在s指的是另一个对象.虽然我们没有改变d参考值 - 但它继续指的"lana del rey"是原来的情况.

现在真实的比喻:

有两个人(A和B)用手指指向远处的建筑物.它们彼此独立,甚至看不到另一个指向的东西.然后A决定开始指向另一个建筑物.只要它们没有相互连接 - 现在A指向另一个建筑物,并B继续指向原始建筑物(因为没有人要求他们停止这样做)

PS:你可能会混淆的是指针和参考背后的概念.不确定在这里解释它是否有意义,因为你可能会更加困惑.但现在至少你可以谷歌搜索相应的关键字.