如何有效地实现不可变类型

yas*_*891 5 c# c#-4.0

在编写C#时,我经常发现自己实现了不可变类型.我总是写了很多代码,我想知道是否有更快的方法来实现它.

我通常写的:

public struct MyType
{
  private Int32 _value;
  public Int32 Value { get { return _value;} }

  public MyType(Int32 val)
  {
     _value = val;
  }
}

MyType alpha = new MyType(42);
Run Code Online (Sandbox Code Playgroud)

当字段数量增加并且输入很多时,这变得相当复杂.有没有更有效的方法来做到这一点?

adr*_*nks 5

我建议编写更少代码的唯一方法是使用像ReSharper这样的东西为你自动生成代码.如果您从以下内容开始:

public class MyType
{
    private int _value;
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以生成"只读属性",以便:

public class MyType
{
    private int _value;
    public int Value{get {return _value;}}
}
Run Code Online (Sandbox Code Playgroud)

然后生成构造函数给出:

public class MyType
{
    private int _value;
    public int Value{get {return _value;}}

    public MyType(int value)
    {
        _value = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

生成步骤总共是8个按键.


如果你真的想要一个不可修改的不可变类,我会声明它:

public sealed class MyType
{
    public int Value{get {return _value;}}
    private readonly int _value;

    public MyType(int value)
    {
        _value = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

这使得类不可导出(意味着子类不能修改其内部状态),并且该_value属性仅在构造期间可分配.不幸的是,ReSharper没有为此模式生成代码,因此您仍然需要手动构建(大部分)它.

  • +1使密封的类.为继承而设计的不可变类根本没有任何意义. (2认同)