我目前知道有两种方法可以在C#中使实例不可变:
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)
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)
如果有一个实例,一旦实例化,将不会被更改,这将是一件好事.const而readonly这样做的一个小的程度,但在他们的范围是有限的.我只能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)
您不能阻止在C#中重新分配变量,但字段除外,正如您已经提到的那样使用const或readonly.
您可以通过包装它来创建任何现有可变类型的自己的不可变版本,或者如果它是您自己的类,重新编写它是不可变的但是您无法在方法中为变量实现它,这是您的问题似乎得到的在.
F#有一些不可变性的选项(' let关键字,如果我记得正确的话),C#没有,所以如果你仍然想要利用.NET的强大功能但完全不变的话,可能值得看F#.