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

时间:2018-01-12 17:13:24

标签: c# f# heap immutability

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

但是,我无法理解单词typedef enum { T1_foo, T1_bar, T1_bletch } EnumType1; typedef enum { T2_bletch, T2_foo, T2_bar } EnumType2; 的含义,如果要与F#analogue进行比较:

immutable

由于下一个原因,这个人不会编译:

  

错误FS0027:此值不可变。考虑使用mutable   关键字,例如'让可变数据=表达'。

所以...如果要将F#行为与C#行为进行比较,似乎F#具有不变性的真正含义,或者我不理解这个术语的真正含义......

让我们看一下C#变种:

open System
let data = "London"
data <- "123"
Console.WriteLine data

输出结果为:class Program { static void Main() { var a = "London"; a = "123"; System.Console.WriteLine(a); } }

让我们从下一篇文章中获取信息:Why are the strings immutable in .NET?

String appending

老实说,如果看一下这张照片并将其与F#变体进行比较,我就无法看到不变性......但我也理解,SO上有超过100人(问题是在这个问题的顶部)可能是错的,并给出了错误的名称。

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

1 个答案:

答案 0 :(得分:9)

你将F#中变量的不变性与C#中对象的不变性混淆。

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

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