gpt4 book ai didi

c# - C#中的字符串赋值

转载 作者:IT王子 更新时间:2023-10-29 04:38:57 27 4
gpt4 key购买 nike

几周前,我发现 C# 中的字符串被定义为引用类型而不是值类型。最初我对此感到困惑,但在阅读之后,我突然明白了为什么将字符串存储在堆上而不是堆栈上很重要——因为将一个非常大的字符串复制到一个不可预测的数字上是非常低效的栈帧。我完全接受这一点。

我觉得我的理解几乎是完整的,但是我缺少一个元素——字符串使用什么语言特性来保持它们的不可变性?用一个代码示例来说明:

string valueA = "FirstValue";
string valueB = valueA;
valueA = "AnotherValue";

Assert.AreEqual("FirstValue", valueB); // Passes

当我将 valueA 分配给 valueB 时,我不明白是什么语言功能复制了 valueA。或者,当我将它分配给 valueB 时,对 valueA 的引用并没有改变,当我设置字符串时,只有 valueA 获得了对自身的新引用。由于这是一个实例类型,我不明白为什么会这样。

我知道您可以重载,例如 == 和 != 运算符,但我似乎找不到任何关于重载 = 运算符的文档。什么解释?

最佳答案

what language feature do strings use to keep them immutable?

这不是语言功能。这是定义类的方式。

例如,

class Integer {
private readonly int value;

public int Value { get { return this.value; } }
public Integer(int value) { this.value = value; } }
public Integer Add(Integer other) {
return new Integer(this.value + other.value);
}
}

类似于 int 除了它是引用类型,但它是不可变的。我们定义它是这样的。我们也可以将其定义为可变的:

class MutableInteger {
private int value;

public int Value { get { return this.value; } }
public MutableInteger(int value) { this.value = value; } }
public MutableInteger Add(MutableInteger other) {
this.value = this.value + other.value;
return this;
}
}

看到了吗?

I do not understand what language feature makes a copy of valueA when I assign it to valueB.

它不复制字符串,它复制引用。 string 是引用类型。这意味着 string 类型的变量是其值是引用的存储位置。在这种情况下,它们的值是对 string 实例的引用。当您将 string 类型的变量分配给另一个 string 类型的变量时,将复制该值。在这种情况下,该值是一个引用,它是通过赋值复制的。对于任何引用类型都是如此,而不仅仅是 string 或仅不可变引用类型。

Or perhaps, the reference to valueA does not change when I assign it to valueB, only valueA gets a new reference to itself when i set the string.

不,valueAvalueB 的值引用相同的string 实例。它们的值是引用值,并且这些值是相等的。如果你能以某种方式改变 * valueA 引用的 string 的实例,valueAvalueB 会看到这个突变。

As this is an instance type, I do not understand why this works.

没有实例类型这样的东西。

基本上,string 是引用类型。但是 string 是不可变的。当您改变 string 时,您会得到一个新字符串的引用,该字符串是对现有 string 的改变的结果。

string s = "hello, world!";
string t = s;
string u = s.ToUpper();

这里,st 是变量,它们的值引用相同的string 实例。 s 的引用不会因调用 String.ToUpper 而改变。相反,s.ToUppers 的引用进行了修改,并返回对它在此过程中创建的 string 的新实例的引用应用突变。我们将该引用分配给 u

I understand that you can overload, for example, the == and != operators, but I cannot seem to find any documentation on overloading the = operators.

您不能重载 =

* 您可以使用一些技巧。忽略它们。

关于c# - C#中的字符串赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6236569/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com