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

本文关键字:属性 默认不可变 默认 有效地 不可变 | 更新日期: 2023-09-27 18:03:59

现在阅读f#和c#,最大的区别之一是,f#变量默认是不可变的,而大多数c#引用类型默认是可变的。

这带来了一个问题,如何有效地将这种"默认不可变"引入c#编码?呃…我是说c# 4.0..

我想到的是"不可变属性"。因此,当它通过Aspect被停靠到一个类时,类的每个成员都会被检查,因此它们只在构造函数中是可变的。

你觉得怎么样?

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

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