c# - 字符串不变性在向开发人员解释字符串引用时扮演什么角色?

标签 c# objective-c string language-design immutability

我经常以一种或另一种形式遇到以下问题(在此处以伪代码形式提出):

String myString = "Hello"
someObject.stringProperty = myString
myString = "World"

Why doesn't someObject.stringProperty now equal "World"?

以下陈述在解释为什么会这样时所起的作用似乎令人困惑:

Strings are Immutable

你怎么看?

如果您认为该声明不适用,我会问您:在一种语言中,字符串 是可变的,并且赋值运算符改变了它们的实际值(而不是简单地更改引用),你的回答是否仍然有意义?

编辑:

好的,我觉得有必要澄清一些事情:

  1. 我对字符串、引用或赋值的工作方式并不感到困惑。我对这个话题非常清楚。我不是在问字符串是如何工作的。我在问“字符串不变性在向开发人员解释字符串引用时扮演什么角色”。我们可以跳过我必须混淆的 Ad-Hominem 攻击。

  2. 我正在为提出引用问题的开发人员寻找一个逻辑上严格的答案,该问题不包含或预先假设字符串的不变性。

现有论点的分类:

  1. String Immutability 与它无关,因为引用在变化,而不是字符串的值在变化 这个答案预先假设了我要问的确切事实。

  2. 赋值意味着引用赋值而不是值赋值 同样,这预先假设了我要问的确切事实。没有理由 必须 是字符串的情况。出于性能和其他原因,它只是 字符串的情况。

最佳答案

语句在解释中扮演的角色取决于解释本身。它可能有害或有用,具体取决于其余的解释。

就我个人而言,直到解释的相当晚才使用该声明(至少现在是这样)。字符串的不变性只是有点妨碍——就像参数传递解释一样。我将从使用可变类的解释开始,如下所示:

House x = new House(Color.Green); // The has a green front door
House y = x;
x = new House(Color.Red);
Console.WriteLine(y.FrontDoorColor); // Still green!

这里我要解释一下,xy 就像一张纸,上面写着房子的地址。第二行的赋值没有复制house - 它复制了房子的地址。 third 行的赋值不会改变第一栋房子前门的颜色 - 它创建了一座房子,然后擦掉了第一栋房子的地址纸 (x),并写上新地址。这不会改变第一所房子或第二张纸 (y) 的任何内容。

然后我会产生第二个例子:

House x = new House(Color.Green); // The has a green front door
House y = x;
x.FrontDoorColor = Color.Red; // Repainting a front door
Console.WriteLine(y.FrontDoorColor); // Red!

这次只有一栋房子 - 如果我粉刷一栋房子的门,然后你带着我之前给你的地址来看它,你会看到前门现在是红色的。

到目前为止,还不错。 现在我可以回到原来的例子,说它已经看起来像第一个房子片段而不是第二个片段,所以它的行为方式相同。然后我可以说字符串不变性意味着您甚至不能编写看起来像二宫示例但使用字符串的代码。因此,字符串不变性不会立即与现有代码的解释相关,但它仍会出现在同一个答案中。

(我还必须指出,虽然引用的行为类似于真实世界的地址,但我并不是说它们与“内存地址”或指针相同。They don't have to be。我正在使用严格类比现实世界,仅此而已。这是示例的缺点,但我认为它不会造成太大伤害。)

我可能然后也会谈论值类型,并考虑如果 House 是值类型会发生什么 - 以及不鼓励可变值类型。

要知道我的答案是否仍然适用于具有可变字符串的语言,我们需要更多地了解字符串文字的行为方式。一种在所有方面都与 C# 相同的语言,除了字符串的可变性之外,这将是一种糟糕的语言,正如您可以这样写:

// Hypothetical bad language
string x = "dog";
x.MutateTo("cat");
Console.WriteLine("dog"); // Prints cat!

这显然是不可取的,因此大概必须改变字符串文字的行为。您还谈到了赋值运算符的含义可能发生的变化,等等……如果不确切了解一种假设的语言的行为方式,就很难对它做出具体的陈述。

关于c# - 字符串不变性在向开发人员解释字符串引用时扮演什么角色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6560916/

相关文章:

c# - 在并发编辑环境中为子实体强制执行不变量

c# - 从电子邮件中的超链接调用 WCF 服务

iphone - 变量的类型不完整 'struct sockaddr_in'

c - 我的递归函数有问题

ios - 从 NSString 中删除所有非数字字符,保留空格

c# - Web API 的性能

C#三角函数/数学函数

iphone - 从 ViewController 调用 facebook,而不是从 appdelegate

objective-c - Profiler 告诉我与 nil 的比较速度很慢

regex - R:gsub 和捕获