现在阅读F#和C#,其中一个最大的区别是,F#变体默认是不可变的,大多数C#引用类型默认是可变的。
这带来了一个问题,如何有效地将这种“不可变为默认值”引入C#编码?呃...我的意思是C#4.0 ..
我想到的是“不可改变的属性”。 所以,当它被一个类停靠时,通过Aspect,检查类的每个成员,以便它们只在构造函数中是可变的。
你觉得怎么样?
答案 0 :(得分:4)
readonly
关键字是一种语言级构造,用于执行您请求的操作。应用于成员变量时,只能在构造函数中设置它们,并且必须在构造函数中设置。
答案 1 :(得分:3)
我不熟悉F#,但C#确实有一个只读关键字,只能应用于在创建对象时初始化的成员:
public class MyExample
{
private readonly IDependency _dependency;
public MyExample(IDependency dependency)
{
_dependency = dependency;
}
public IDependency Dependency
{
get { return _dependency; }
}
}
关键字只能应用于不可变的成员,这意味着没有机制可以从类外部改变它们。
答案 2 :(得分:3)
我不完全确定你要完成什么 - 无论你是在为C#建议一个新功能,还是在问你如何实现强制私有变量是不可变的,除非在构造期间。
如果是后者,您可以通过在声明它们时设置私有变量readonly
来实现此目的。默认情况下,您不能将每个变量声明为“只读”,因此您始终必须指定此关键字,但在编写新代码时需要遵守一些规则,这样就可以完成工作。
还有一点需要注意:变量不可变与它指向不可变的对象不同。
例如,
public class MyClass
{
private readonly List<string> myList;
public MyClass()
{
myList = new List<string>(); // okay
}
public void DoStuff()
{
myList = new List<string>(); // not okay; myList is readonly!
myList.Add("this will work"); // okay -- the list itself is still mutable
}
}