【问题标题】:Readonly field vs. readonly property [duplicate]只读字段与只读属性 [重复]
【发布时间】:2016-12-19 17:21:13
【问题描述】:

有时我会看到使用只读成员定义的类,如下所示:

class Foo
{
    private readonly string bar;

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

    public string Bar => bar;
}

有时我会看到使用只读成员定义的类,如下所示:

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

    public string Bar { get; private set; }
}

第二个示例对我来说看起来更易读/更简洁,但我想知道是否有任何正当理由明确定义 readonly 支持字段(根据第一个示例)?

Qudos 对这两个示例进行了深入分析,理想情况下涵盖了 CLR 中真正发生的事情。

【问题讨论】:

  • 其实第二个版本非常不同。等效版本是public string Bar {get;} 您发布的public string Bar { get; private set; } 示例不是只读的,只是不能公开设置。
  • 斯科特,您的评论应该是一个答案。先生说得好。
  • 您的第一个示例无法为我编译。
  • @user1620220 为什么?你在使用
  • @series0ne 如果您真的喜欢第二个,那么您可以通过简单地删除 setter 使其与第一个完全等效,例如public string Bar { get; }。又一个 C#6 改进。

标签: c#


【解决方案1】:

第一种是简写

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

这就是一个带有 getter 的属性;这只是编写 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 方法。

我想知道是否有任何正当理由明确定义只读支持字段

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

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

【讨论】:

  • 反射对两者都有影响吗?
  • @series0ne:我不明白这个问题。
  • 好吧,大概我不能在第一个示例中调用 setter,因为它没有,并且大概不管它是只读的,反射会让我随意更改值?跨度>
  • @series0ne:如果您的组件被授予私有反射权限,那么您的组件实际上可以做它想做的任何事情。完全信任意味着完全信任 -- 你可以打破规则并负责理解这样做的完全后果。如果您想使用私有反射权限来处理实现细节的值,那是您的权利。
  • 答案中的最后一段不是决定使用什么的唯一重要因素吗?如果您想更改构造函数之外的值,请不要使用只读支持字段,否则将其保留为只读或我遗漏了什么?
猜你喜欢
  • 2013-05-20
  • 1970-01-01
  • 2013-06-06
  • 2017-02-23
  • 2021-11-23
  • 2011-04-18
  • 2010-11-22
  • 2019-08-23
相关资源
最近更新 更多