Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 作为副本传递的C字符串引用类型?_C#_Reference Type - Fatal编程技术网

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

C# 作为副本传递的C字符串引用类型?,c#,reference-type,C#,Reference Type,我对C字符串引用类型有这个疑问 以下代码: string s = "lana del rey" string d = s; s = "elvis presley"; Console.Writeline(d); 为什么输出不是猫王?如果d指向s的相同内存位置 你能解释一下吗 对我最初的问题有一个更详细的解释: 你所有的答案都很有用。 这个常见的代码示例经常用来解释值类型和引用类型之间的差异,我就想到了这个问题: class Rectangle { public double Lengt

我对C字符串引用类型有这个疑问

以下代码:

string s = "lana del rey" 
string d = s;
s = "elvis presley";
Console.Writeline(d);
为什么输出不是猫王?如果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);
在这种情况下,第二个Console.WriteLine语句将输出:“rect1.Length=100”

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


提前感谢。

C中的字符串是不可变的;这意味着他们无法改变。当你说s=elvis presley时,你正在创建一个新字符串并将其引用赋值给s;这不会影响保存到d的引用,d仍然指向原始字符串。

字符串是不可变的。s=elvis presley实际上正在创建一个新字符串,并将其引用赋值给变量s。虽然变量d仍然引用第一个字符串lana del rey。

字符串的处理方式与常规引用类型不同,但编译器基本上就是这样做的:

string s = new String("lana del rey");
string d = new String(s);
s = new String("elvis presley");
Console.Writeline(d);
点是一个字符串引用点,指向s的字符串值。任何时候创建并引用一个新字符串时,它都是一个新字符串,并且对原始值的任何引用都保持不变。

这与可变性无关

string s = "lana del rey" 
string d = s;
这里两个变量s和d表示内存中的同一对象

s = "elvis presley";
在语句的右侧,新对象被分配并初始化为elvis presley,并分配给s。现在s指的是另一个物体。虽然我们没有改变d的参考值,但它仍然像最初一样引用拉娜·德雷

现在是现实生活中的类比:

有两个人A和B用手指指着远处的一座建筑物。他们彼此独立,甚至看不到别人指的是什么。然后A决定开始指向另一栋建筑。只要它们彼此没有连接——现在A指向另一栋建筑,B继续指向原来的建筑,因为没有人要求它们停止这样做


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

让我们逐行查看你的代码

string s = "lana del rey";
通过这条线,您创建了一个由s引用的字符串对象lana del rey

通过这一行,您创建了一个名为d的引用,该引用引用了内存中的同一个对象,在本例中,该对象是带有s的lana del rey

通过这一行,您创建了一个新的字符串对象elvis presley,由s引用,s不再引用lana del rey


自从D仍然引用LaaaDel-Ry,它打印LaaaDel-Ry。

< P>从微软.NETFramework 2应用程序开发基金会70版536:

因为引用类型表示数据的地址,而不是数据本身, 将一个引用变量分配给另一个引用变量不会复制数据。相反,分配 对另一个实例的引用变量仅创建引用的第二个副本, 它引用堆上与原始变量相同的内存位置

然后我想:

string s = "lana del rey"; // (creates a reference to the memory location X)
string d = s; // (creates a copy of the reference to the same memory location X)
d = "elvis presley"; // (creates a new reference to the new memory location Y)

几分钟前你问了同样的问题,然后删除了你的问题。相关链接对你没有帮助吗?假设你说的是int x=1;int y=x;x=2;Console.WriteLiney;你认为y是1还是2?int y=x并不意味着y现在是x的别名。这意味着y的当前值更改为x的当前值。他们之间没有形成永久的关系。你的s和d也是如此。@EricLippert我想他把引用和指针混淆了,就像zerkms提到的。如果你有一个新问题,那么你应该问一个新问题,不要将一个新问题编辑成一个现有的和已经回答的问题。感谢您的所有反馈@ServyEven对于可变类型,行为将是相同的。s是一个引用,而不是指针。所以字符串就像引用类型的一个例外?@AlbertoMontellano不。有很多不可变的引用类型,你可以根据自己的需要创建更多的引用类型,它们没有任何例外。@AlbertoMontellano不是真的它是一个例外的引用类型,但不是你的意思。任何时候,只要指定给引用类型的变量,就只需更改该变量引用的对象。您没有修改原始对象。原始对象仍然存在,其他变量可能会引用它。如果不存在,则该对象符合垃圾收集的条件。在这种情况下,字符串的行为是否为值类型?创建值的副本?@AlbertoMontellano不,它不正常
与值类型类似,它的行为类似于引用类型,因为这正是它的本质。你不是在创造一个值的副本,你是在创造一个引用的副本。从问题的措辞和性质来看,作者理解s被设置为d的引用。他不明白的是,elvis presley正在创建一个新的字符串实例,而不是设置引用的实例的值。这就是为什么这么多答案中都提到了字符串不变性:为了说明为什么要创建一个新的字符串实例。@crush:我看不出这有什么关系-两个字符串都没有被修改,甚至都没有尝试:-S@crush:和可变引用类型表现出相同的行为,不是吗?键入x=y,其中x是一个引用类型可变或不可变永远不意味着修改x引用的对象。在我看来,作者认为s=elvis presley正在修改使用字符串s=lana del rey;创建的字符串实例;。是的,可变引用类型表现出相同的行为。但是作者不明白正在创建一个新的引用。他认为他只是在设定现有参考的价值。这是我得出的结论,至少在阅读这个问题的设置方式时是这样的。在他的示例代码中似乎很明显,他知道s=d正在将这两个引用相互设置。@crush:但作者不明白正在创建一个新引用,并且创建一个新实例仍然与可变性无关。我的观点是字符串引用指向s的字符串值。任何时候,当一个新字符串被创建和引用时,它就是一个新字符串,并且对原始值的任何引用仍然是完整的。然而,这一点实际上并不在你的答案中。最好是直言不讳。我怀疑OP的技术水平的人会从看到的代码中推断出来。归结起来,每个字符串分配都是一个新的字符串,你会如何解释它?我只是想在这里提出一些观点。。。我将编辑我的答案=或多或少就像你在第一次评论中所做的那样。我只是说你的回答中应该有评论,而不是评论。
s = "elvis presley";
Console.Writeline(d);
string s = "lana del rey"; // (creates a reference to the memory location X)
string d = s; // (creates a copy of the reference to the same memory location X)
d = "elvis presley"; // (creates a new reference to the new memory location Y)