c# 属性和字段的区别
C#中定义一个变量时,可以定义成属性或者字段。之前都习惯性的定义成了字段,一直不理解两者的区别。只是在wpf中xaml要绑定时才去使用属性。
//字段
public string Name;
//属性 可以在xaml中绑定
public string Name {get;set;}
后来因为绑定的数据更新问题,了解到了INotifyPropertyChanged。
于是在界面上需要更新的数据定义就变成了这个样子
public class UserVM : INotifyPropertyChanged
{
/// <summary>
/// 属性变更事件
/// </summary>
public event PropertyChangedEventHandler? PropertyChanged;
/// <summary>
/// 属性变更事件
/// </summary>
/// <param name="propertyName">事件源</param>
protected void RaisePropertyChanged(string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private string _name = "";
public string Name
{
get=>_name ;
set
{
_name = value;
RaisePropertyChanged(nameof(Name))
}
}
}
再进阶了解到
public string Name {get;set;}
//上面的写法和下面的写法是相等的。只是上面的写法编辑器会自动生成一个私有字段
private string _name = "";
public string Name
{
get=>_name ;
set=>_name = value;
}
后来写过Java,发现其实java逻辑也差不多。
public class User{
private String name; //私有字段
public String getName() { //name的可读属性
return name;
}
public void setName(String name) { //name的可写属性
this.name = name;
}
}
只是java需要定义字段+getter方法+setter方法,而C#可以直接简写。
最后的出结论:属性就是字段加上读写方法。
那么也就得出属性的使用场景了。
即需要在读写字段是实现其他功能,包括
只对类外暴露getter方法
读取或写入值前后需要进行其他固定操作
License:
CC BY 4.0