文章

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