如果字符串是引用类型,为什么在这种情况下 strA 的值没有变化?[复制]

If string is a reference type, why is strA's value not changing in this case? [duplicate]

提问人:PakiPat 提问时间:9/29/2017 最后编辑:maccetturaPakiPat 更新时间:9/29/2017 访问量:141

问:

我以为我理解了 Reference 和 Value 类型之间的区别。我以为 “string”只有值类型语义,同时保留了引用类型的行为。然后我尝试了这个,希望看到 True 在这两种情况下都返回。 我误解了什么?

        string strA = "AAA";
        string strB = strA;
        strB = "BBB";
        Console.WriteLine($"strA is {strA} and strB is {strB}");
        Console.WriteLine($"The statement: strA == strA is {strA == strB} \n");

        Car car1 = new Car();
        car1.Horsepower = 190;
        Car car2 = car1;
        car2.Horsepower = 200;
        Console.WriteLine($"car1.Horsepower is {car1.Horsepower} and car2.Horsepower is {car2.Horsepower}");
        Console.WriteLine($"The statement: car1 == car2 is {car1 == car2}");

输出:

strA 是 AAA,strB 是 BBB

语句: strA == strA is False

汽车1。马力是 200 和 car2。马力是 200

语句:car1 == car2 为 True

C# .NET 按引用传递 值类型引用 类型

评论

0赞 Aaron 9/29/2017
设置字符串值后,它将指向内存中的该位置。它永远不会改变。如果设置一个新值,则实际上会得到一个新指针,指向内存中保存新值的不同位置。如果您想要此行为,请尝试使用字符串生成器。StringBuilder builderA = 新 StringBuilder(“AAA”);StringBuilder builderB = 构建者 A;builderB.Replace(“AAA”, “BBB”);Console.WriteLine($“builderA 为 {builderA.ToString()},builderB 为 {builderB.ToString()}”);
0赞 PakiPat 9/29/2017
@Aaron:啊。我知道 C# 中的字符串是不可变的。我想我没有反对当我们更改值时,指针会更改的想法。感谢您对 StringBuilder 的深入了解。如果可以的话,我会将此评论标记为答案。
0赞 PakiPat 9/29/2017
那么,可以肯定地说,字符串与其他“纯”引用类型共有的唯一方面是它保存在堆中而不是堆栈中?

答:

2赞 zneak 9/29/2017 #1

字符串文本指定字符串实例。为了方便起见,将字符串转换为汽车,这基本上就是您对字符串所做的:

Car AAA = new Car();
Car BBB = new Car();

Car carA = AAA;
Car carB = carA;
carB = BBB;
Console.WriteLine($"carA is {carA} and carB is {carB}");
Console.WriteLine($"The statement: carA == carB is {carA == carB}

最大的区别在于,您使用而不是 /,因为编译器为静态字符串预先分配对象。"string literals"new Carnew String