我怀疑与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是值类型.如何使用字符串演示相同的引用类型行为?
提前致谢.
C#中的字符串是不可变的 ; 这意味着他们无法改变.当您说s = "elvis presley"您正在创建新字符串并将其引用分配给s; 这不会影响保存的引用d仍然指向原始字符串.
它与可变性无关
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:你可能会混淆的是指针和参考背后的概念.不确定在这里解释它是否有意义,因为你可能会更加困惑.但现在至少你可以谷歌搜索相应的关键字.