在C#中实现本地运行时不变性

KCh*_*oux 5 c# immutability

我目前知道有两种方法可以在C#中使实例不可变:

方法1 - 编译时间不变性

void Foo() 
{
    // Will be serialized as metadata and inserted
    // as a literal. Only valid for compile-time constants
    const int bar = 100;
}
Run Code Online (Sandbox Code Playgroud)

方法2 - 只读字段

class Baz
{
    private readonly string frob;

    public Baz()
    {    
         // Can be set once in the constructor
         // Only valid on members, not local variables
         frob = "frob";
    }
}
Run Code Online (Sandbox Code Playgroud)

如果有一个实例,一旦实例化,将不会被更改,这将是一件好事.constreadonly这样做的一个小的程度,但在他们的范围是有限的.我只能const用于编译时常readonly量和成员变量.

有没有办法在初始实例化后赋予局部变量不变性(方式readonly有效,但在更一般的层面上)?


Scala使用var关键字执行此操作,该关键字声明了一个新的不可变值,在获取其初始值后无法重新分配:

var xs = List(1,2,3,4,5) // xs is a value - cannot be reassigned to
xs = List(1,2,3,4,5,6);  // will not compile
Run Code Online (Sandbox Code Playgroud)

Tre*_*ley 5

您不能阻止在C#中重新分配变量,但字段除外,正如您已经提到的那样使用constreadonly.

您可以通过包装它来创建任何现有可变类型的自己的不可变版本,或者如果它是您自己的类,重新编写它是不可变的但是您无法在方法中为变量实现它,这是您的问题似乎得到的在.

F#有一些不可变性的选项(' let关键字,如果我记得正确的话),C#没有,所以如果你仍然想要利用.NET的强大功能但完全不变的话,可能值得看F#.