为只读字段创建属性是否有价值

时间:2019-04-01 21:21:12

标签: c# properties field

创建不可变类型时,为只读字段创建属性是否有任何价值?

公共只读字段:

public class MyClass 
{
    public readonly string MyText;

    public MyClass (string theText)     
    {
        MyText = theText;
    }
}

具有公开属性的私有只读字段:

public class MyClass 
{
    private readonly string myText;

    public string MyText    
    {
        get { return myText; }
    }

    public MyClass(string theText)  
    {
        myText = theText;
    }
}

2 个答案:

答案 0 :(得分:0)

字段通常用于包含实现细节。因此,他们should not be declared in a manner that is visible使用其他代码库。公共的非内部字段将违反此规则。如果调用方直接使用这些字段,则它们违反了一般SOLID原则,即实现应依赖于抽象。

此外,与字段相比,属性具有某些优势。属性可以包含在界面中,例如fields cannot时。同样,属性可以是虚拟的,抽象的和覆盖的,而fields cannot

答案 1 :(得分:0)

作为@John Wu答案的补充:

在C#6和更高版本中,您可以使用仅在构造函数中可分配的只读属性:

public string MyText { get; }

这使您不必仅仅拥有支持此属性的后备字段。

但是故事还没有结束,属性不是字段而是方法

知道这一点,它可以使您完成某个字段无法完成的任务,例如:

通过实施INotifyPropertyChanged通知价值变化:

using System.ComponentModel;
using System.Runtime.CompilerServices;

public class Test : INotifyPropertyChanged
{
    private string _text;

    public string Text
    {
        get => _text;
        set
        {
            if (value == _text)
                return;

            _text = value;
            OnPropertyChanged();
        }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

成为您可以绑定的值:

在WPF和UWP中,您只能绑定到属性,而不能绑定到字段。

最后:

这取决于您的要求。