C# 6.0特性 学习 只读自动属性


本文某些内容来源于c#微软官方文档

本文源码

我们来了解一下【只读自动属性】

只读自动属性 提供更简洁的语法创建不可变类型。 声明只有 get 访问器的自动属性。

public string FirstName { get; }
public string LastName { get;  }

首先我们来创建Student类

 public class Student
 {
        public string FirstName { get; }
        public string LastName { get; }
 }

给Student类创建构造函数

        public Student(string firstName, string lastName)
        {
            if (string.IsNullOrWhiteSpace(lastName))
                throw new ArgumentException(message: "Cannot be blank", paramName: nameof(lastName));
            FirstName = firstName;
            LastName = lastName;
        }

给Student类创建ChangeName方法

        public void ChangeName(string newLastName)
        {
            // Generates CS0200: Property or indexer cannot be assigned to -- it is read only
            LastName = newLastName;
        }

如下图所示,会遇到CS0200 错误(Property or indexer 'Student.LastName' cannot be assigned to -- it is read only

因此,我们可以了解c#自动属性创建后,只能在构造函数中赋值,不能在c#对象实例化后,再次赋值(修改)。

 

自动属性表达式

自动属性,通过表达式初始化。

创建自动属性FullName

public string FullName { get; }

然后添加表达式

public string FullName { get; } => $"{FirstName}, {LastName}";

 

如上图遇到错误 CS8057    Block bodies and expression bodies cannot both be provided.

 

我们去掉花括号,使用正确的方法创建自动属性FullName表达式。

 

public string FullName => $"{FirstName}, {LastName}";

没有使用只读自动属性的例子

我们来了解一下,没有使用新特性自动属性的例子。

第一个例子

  public class StudentOlder_01
 {
        private string _firstName;
        public string FirstName { get { return _firstName; } }
        private string _lastName;
        public string LastName { get { return _lastName; } }
        public StudentOlder_01(string firstName, string lastName)
        {
            if (string.IsNullOrWhiteSpace(lastName))
                throw new ArgumentException(message: "Cannot be blank", paramName: nameof(lastName));
            _firstName = firstName;
            _lastName = lastName;
        }
 }

FirstName属性通过 _firstName 变量缓存值,通过只提供get访问器,限制赋值。但是不能避免_firstName被赋值,导致值被修改。

第二个例子

    public class StudentOlder_02
    {
        private readonly string _firstName;
        public string FirstName { get { return _firstName; } }
        private readonly string _lastName;
        public string LastName { get { return _lastName; } }
        public StudentOlder_02(string firstName, string lastName)
        {
            if (string.IsNullOrWhiteSpace(lastName))
                throw new ArgumentException(message: "Cannot be blank", paramName: nameof(lastName));
            _firstName = firstName;
            _lastName = lastName;
        }
}

通过 readonly 关键字限制 _firstName 被再次赋值。