C#:如何有效地将“默认不可变”引入C#?不可变的属性?

时间:2011-07-29 04:11:19

标签: c# immutability

现在阅读F#和C#,其中一个最大的区别是,F#变体默认是不可变的,大多数C#引用类型默认是可变的。

这带来了一个问题,如何有效地将这种“不可变为默认值”引入C#编码?呃...我的意思是C#4.0 ..

我想到的是“不可改变的属性”。 所以,当它被一个类停靠时,通过Aspect,检查类的每个成员,以便它们只在构造函数中是可变的。

你觉得怎么样?

3 个答案:

答案 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
    }
}