如果将C#字符串与F#analogue进行比较,为什么C#字符串的标题为"不可变"?

Nev*_*nds 3 c# heap f# immutability

我已经阅读了那些较旧的主题:

但是,immutable如果将它与F#analogue进行比较,我无法理解这个词的含义:

open System
let data = "London"
data <- "123"
Console.WriteLine data
Run Code Online (Sandbox Code Playgroud)

由于下一个原因,这个将无法编译:

错误FS0027:此值不可变.考虑使用mutable关键字,例如'let mutable data = expression'.

所以...如果要比较F#行为和C#one,似乎F#具有不变性的真正含义,或者我不明白这个术语的真正含义......

我们来看看C#变体:

class Program
{
    static void Main()
    {
        var a = "London";
        a = "123";
        System.Console.WriteLine(a);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出将是:123.

让我们从下一篇文章中获取信息:为什么字符串在.NET中是不可变的?

字符串附加

老实说,如果要查看这张图并将其与F#变体进行比较,我看不到不变性......但是,据我所知,SO上有超过100人(问题发表在这个问题的顶部)不能错,并为这种意义给出错误的名称.

请告诉我为什么C#字符串被调用immutable,如果我可以更改它的值?如果要将其与F#样本进行比较,则单个含义的结果会有所不同.

Pet*_*ham 9

您将F#中变量的不变性与C#中对象的不变性混淆起来.

在C#中,您可以更改表示变量指向的字符串的对象.但是你不能改变关于那个对象的任何东西,因此对象是不可变的.

在F#中,您无法更改变量具有的值,因此该变量也是不可变的.

  • 值得注意的是,在第一个F#案例中,如果数据被声明为如此,代码将像C#案例一样编译和工作:`let mutable data ="London"`.因此,可变性异常是由于*variable*数据是不可变的,这当然与你在答案中所说的一致. (2认同)