【问题标题】:Can I safely substitute a readonly property for a readonly public field? [duplicate]我可以安全地将只读属性替换为只读公共字段吗? [复制]
【发布时间】:2017-12-05 03:36:09
【问题描述】:

我的团队遵循一般的 .NET 约定,即您应该公开类型的公共属性,而不是公开字段。但是,我遇到了一个大部分公开字段的类......但随后包含它的两个“识别”数据:

public readonly int WidgetId;
public readonly string WidgetName;

我真的很想将这些重构为属性,即

public int WidgetId { get; }
public string WidgetName { get; }

所以它们符合班级其他人的约定。我知道支持和反对公共字段与属性的论点。但是,鉴于 readonly-auto-properties 特别是一个相对较新的 C# 功能,我想知道:

public readonly int Foopublic int Foo { get; } 之间的语义差异是什么(如果有)?它们与编译器是否有明显的不同?

【问题讨论】:

  • @PeterDuniho 在我看来它不是重复的。问题是关于只读属性和字段,而不是关于只读和私有关键字。
  • @Backs:“不是关于只读和私有关键字”——当然是。 readonly应用于字段。 “只读”属性只是一个没有可访问设置器的属性。无法访问是因为 setter 根本不存在还是因为它是 private 完全无关紧要。从本质上讲,这仍然是一个与多年来提出的所有其他问题相同的问题。
  • 如果它汇集到实质性回答问题的信息,我可以将其标记为重复。不幸的是,由于 C# 中的 readonly-auto-property 功能相对较新,因此链接线程中的许多内容并不真正适用。我发现严格回答了“公共只读字段和公共只读属性在语义上有何不同?”的问题。是 here,它演示了公共只读属性的 IL:看起来没有语义差异。

标签: c# .net refactoring


【解决方案1】:

您的新属性等于:

private readonly string _widgetName = GetWidgetName();
public string `
{
    get { return _widgetName; }
}

因此,该值存储在_widgetName 中,并且它是安全的,因为它是只读的,并且您不能像以前那样更改它的值。

使用属性WidgetName,您只能更改对字段_widgetName 的访问权限,而不能更改值。例如:

private readonly string _widgetName = GetWidgetName();
public string `
{
    get 
    {
        if (_widgetName == null) throw new Exception("Value is not set"); 
        return _widgetName; 
    }
}

您可以更好地控制您的数据,但在通常情况下 - 如果您只是将 readonly 字段复制到 readonly 属性,则没有区别。

关于属性的一些信息是here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    相关资源
    最近更新 更多