【发布时间】:2017-09-28 19:40:58
【问题描述】:
我以为我理解了引用类型和值类型之间的区别。我以为 '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 为假
car1.Horsepower 为 200,car2.Horsepower 为 200
语句:car1 == car2 为真
【问题讨论】:
-
一旦设置了字符串值,它就会指向内存中的那个位置。它永远不会改变。如果你设置一个新值,你实际上会得到一个新指针,指向内存中保存新值的不同位置。如果您想要这种行为,请尝试使用字符串生成器。 StringBuilder builderA = new StringBuilder("AAA"); StringBuilder builderB = builderA; builderB.Replace("AAA", "BBB"); Console.WriteLine($"builderA 是 {builderA.ToString()} 而builderB 是 {builderB.ToString()}");
-
@Aaron:啊。我知道 C# 中的字符串是不可变的。我想我并没有反对当我们改变一个值时指针改变的想法。感谢您对 StringBuilder 的深入了解。如果可以的话,我会将此评论标记为答案。
-
是否可以肯定地说,字符串与其他“纯”引用类型共有的唯一方面是它保存在堆中而不是堆栈中?
标签: c# .net pass-by-reference value-type reference-type