C:如何有效地引入;“默认情况下不可变”;到C#?不变属性?

C:如何有效地引入;“默认情况下不可变”;到C#?不变属性?,c#,immutability,C#,Immutability,如今阅读F#和C#,其中一个最大的区别是,F#变体在默认情况下是不可变的,大多数C#引用类型在默认情况下是可变的 这带来了一个问题,如何有效地将这种“默认不变”引入C#编码?呃。。。我是说C#4.0 我想到的是一个“不变的属性”。 因此,当它停靠到一个类时,按方面检查该类的每个成员,以便它们仅在构造函数中是可变的 你怎么想?关键字是一个语言级的构造,用于执行你所请求的操作。当应用于成员变量时,它们只能在构造函数中设置,并且必须在构造函数中设置。我不熟悉F#,但C#有一个只读关键字,只能应用于在对

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

这带来了一个问题,如何有效地将这种“默认不变”引入C#编码?呃。。。我是说C#4.0

我想到的是一个“不变的属性”。 因此,当它停靠到一个类时,按方面检查该类的每个成员,以便它们仅在构造函数中是可变的


你怎么想?

关键字是一个语言级的构造,用于执行你所请求的操作。当应用于成员变量时,它们只能在构造函数中设置,并且必须在构造函数中设置。

我不熟悉F#,但C#有一个只读关键字,只能应用于在对象创建时初始化的成员:

public class MyExample
{
    private readonly IDependency _dependency;

    public MyExample(IDependency dependency)
    {
       _dependency = dependency;
    }

    public IDependency Dependency
    {
      get { return _dependency; }
    }
}

关键字只能应用于不可变的成员,这意味着没有任何机制可以从类外修改它们。

我不完全确定您想要实现什么——您是在为C#建议一个新特性,还是在询问如何实现强制私有变量除了在构造过程中是不可变的

如果是后者,则可以通过在声明私有变量时将其设置为只读来实现。在默认情况下,您不能将声明的每个变量都设为“只读”,因此您必须始终指定此关键字,但在编写新代码时要遵守一定的规则,这样才能完成任务

还有一点需要注意:不可变的变量与它指向不可变的对象不同

比如说,

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
    }
}
公共类MyClass
{
私有只读列表myList;
公共MyClass()
{ 
myList=新列表();//好的
}
公共空间
{
myList=new List();//不正常;myList是只读的!
myList.Add(“这将起作用”);//好的——列表本身仍然是可变的
}
}
情况正好相反——请求时[member variables]是不可变的;-)@pst:我认为这个术语是“选择加入不变性”,但Jon Skeet必须验证这一点。