我可以安全地将readonly属性替换为只读公共字段吗?

时间:2017-12-05 03:36:10

标签: c# .net refactoring

我的团队遵循一般的.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; }之间的语义差异是什么?它们与编译器有意义的不同吗?

1 个答案:

答案 0 :(得分:0)

您的新财产等于:

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