创建不可变类型时,为只读字段创建属性是否有任何价值?
公共只读字段:
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;
}
}
答案 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中,您只能绑定到属性,而不能绑定到字段。
最后:
这取决于您的要求。