只读字段与只读属性

时间:2016-12-19 17:21:14

标签: c#

有时我看到用readonly成员定义的类是这样的:

class Foo
{
    private readonly string bar;

    public Foo(string bar)
    {
        this.bar = bar;
    }

    public string Bar => bar;
}

有时我看到用readonly成员定义的类是这样的:

class Foo
{
    public Foo(string bar)
    {
        Bar = bar;
    }

    public string Bar { get; private set; }
}

第二个例子看起来更具可读性/简洁性,但我想知道是否有任何合理的理由明确定义readonly支持字段(根据第一个例子)?

赞成对这两个例子进行深入分析,理想情况是在CLR中涵盖真正发生的事情。

1 个答案:

答案 0 :(得分:9)

第一种是简短的写作方式

class Foo
{
    private readonly string bar;
    public Foo(string bar)
    {
        this.bar = bar;
    }
    public string get_Bar() { return this.bar; }
}

这是一个有吸气剂的财产;这只是编写getter函数的一种简短方法。

第二种是写作的简短方法

class Foo
{
  private string __bar;
  public Foo(string bar)
  {
      this.set_Bar(bar);
  }
  public string get_Bar() { return this.__bar; }
  private void set_Bar(string b) { this.__bar = b; }
}

同样,属性只是幕后的一对get / set方法。

  

我想知道是否有任何合理的理由明确定义只读备用字段

任何一种形式都是完全合法的。选择你喜欢的那个。

我注意到这两种形式并不相同。在第一种情况下,属性的支持字段只能在构造函数中更改;在后者中,属性的支持字段可以在类中的任何位置更改。