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