c#:如何有效地引入“默认不可变”c#吗?不变的属性
本文关键字:属性 默认不可变 默认 有效地 不可变 | 更新日期: 2023-09-27 18:03:59
现在阅读f#和c#,最大的区别之一是,f#变量默认是不可变的,而大多数c#引用类型默认是可变的。
这带来了一个问题,如何有效地将这种"默认不可变"引入c#编码?呃…我是说c# 4.0..
我想到的是"不可变属性"。因此,当它通过Aspect被停靠到一个类时,类的每个成员都会被检查,因此它们只在构造函数中是可变的。
你觉得怎么样?
readonly
关键字是执行您所请求的操作的语言级结构。当应用于成员变量时,它们只能在构造函数中设置,并且必须在构造函数中设置。
我不熟悉f#,但c#确实有一个只读关键字,只能应用于在对象创建时初始化的成员:
public class MyExample
{
private readonly IDependency _dependency;
public MyExample(IDependency dependency)
{
_dependency = dependency;
}
public IDependency Dependency
{
get { return _dependency; }
}
}
关键字只能应用于不可变的成员,这意味着没有机制可以从类外部更改它们。
我不完全确定你想要完成什么——你是在建议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
}
}