c# - 如果与 F# 类似物进行比较,为什么 C# 字符串的标题为 "Immutable"?

标签 c# f# heap-memory immutability

我读过那些较旧的主题:

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

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

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

error FS0027: This value is not mutable. Consider using the mutable keyword, e.g. 'let mutable data = expression'.

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

让我们看看 C# 变体:

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

输出将是:123

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

String appending

老实说,如果看这张图片并将其与 F# 变体进行比较,我看不出不变性......但是,据我所知,SO 上有超过 100 多人(问题发布在这个问题)不会错,也不会为这样的意思起错名字。

请告诉我,为什么 C# 字符串一直被称为 immutable,如果我可以更改它的值?而如果将其与F#示例进行比较,结果就单义而言是不同的。

最佳答案

您混淆了 F# 中变量的不可变性和 C# 中对象的不可变性。

在 C# 中,您可以更改表示变量指向的字符串的对象。但是您无法更改该对象的任何内容,因此该对象是不可变的。

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

关于c# - 如果与 F# 类似物进行比较,为什么 C# 字符串的标题为 "Immutable"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48231010/

相关文章:

javascript - 如何使用 SignalR 向特定客户端发送消息

c# - Win8 Javascript Metro 应用程序,带有 C# WinRT 组件和 SQLite

linux - F# 代码在 REPL 中工作正常,但在编译期间出现堆栈溢出

f# - cons::F# 中序列的运算符?

matlab - 您使用 Matlab/F#/R 进行数据分析和建模算法的经验

c# - 实例化然后分配与声明和分配之间的区别?

java - 在Java中,对对象字段的操作可以绕过堆栈吗?

c# - 为什么我们需要两个接口(interface)来枚举一个集合?

c - 链表——节点的内存地址

时间:2019-03-08 标签:c#datagridviewredcross