C# 中的属性

属性通过属性访问器访问,即get;set;方法

语法

  • 没有显示声明get;set;方法
public class Person
{
    public string FirstName;
    // 没有显示声明get;set;方法
}
  • 显示声明get;set;
public class Person
{
    public string FirstName { get; set; }

}
  • 给属性一个默认值,对于只读属性有最大作用
public class Person
{
    public string FirstName { get; private set; } = "zhangsan";

}
  • 自定义存储,即声明一个field控制属性赋值读取
public class Person
{
    public string FirstName
    {
        get { return firstName; }
        set { firstName = value; }
    }
    private string firstName;

}
  • 升级一下使用lamda表达式
public class Person
{
    public string FirstName
    {
        get => firstName;
        set => firstName = value;
    }
    private string firstName;

}
  • 限制只在构造函数初始化属性
public class Person
{
    public Person(string firstName) => this.FirstName = firstName;

    public string FirstName { get; }

}
  • 计算属性
public class Person
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string FullName => $"{FirstName} {LastName}";
}
  • 缓存计算属性
public class Person
{
    private string firstName;
    public string FirstName
    {
        get => firstName;
        set
        {
            firstName = value;
            fullName = null;
        }
    }

    private string lastName;
    public string LastName
    {
        get => lastName;
        set
        {
            lastName = value;
            fullName = null;
        }
    }

    private string fullName;
    public string FullName
    {
        get
        {
            if (fullName == null)
                fullName = $"{FirstName} {LastName}";
            return fullName;
        }
    }
}
  • 不被序列化
public class Person
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    [field:NonSerialized]
    public int Id { get; set; }

    public string FullName => $"{FirstName} {LastName}";
}
  • 观察者模式
public class Person : INotifyPropertyChanged
{
    public string FirstName
    {
        get => firstName;
        set
        {
            if (string.IsNullOrWhiteSpace(value))
                throw new ArgumentException("First name must not be blank");
            if (value != firstName)
            {
                firstName = value;
                PropertyChanged?.Invoke(this,
                    new PropertyChangedEventArgs(nameof(FirstName)));
            }
        }
    }
    private string firstName;

    public event PropertyChangedEventHandler PropertyChanged;
    // remaining implementation removed from listing
}

参考:https://docs.microsoft.com/zh-cn/dotnet/csharp/properties

posted @ 2022-07-13 09:20  喜爱糖葫芦  阅读(314)  评论(0编辑  收藏  举报