【问题标题】:If string is a reference type, why is strA's value not changing in this case? [duplicate]如果 string 是引用类型,为什么 strA 的值在这种情况下没有改变? [复制]
【发布时间】: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


【解决方案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 Car/new String,因为编译器会为静态字符串预分配对象。

【讨论】:

    猜你喜欢
    • 2020-08-18
    • 2017-11-23
    • 2017-02-15
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    相关资源
    最近更新 更多