属性

属性(property)是一个方法或一对方法,在客户端代码看来,它(们)是一个字段。

例如:

public class User
{
    // 将用户的名称字段设置为_开头且小写形式命名的私有字段。
    private string _name;
    // Name属性包含get和set访问器,来检查和设置支持字段的值
    public string Name
    {
        // get访问器不带任何参数,且必须返回属性声明的类型。
        get 
        {
            return _name; 
        }
        // 也不该为set访问器指定任何显示参数
        set 
        { 
            // 但编译器嘉定它带一个参数,类型与属性相同,并表示为value
            _name = value; 
        }
    }
}

具有表达式体的属性访问器。

在较新的C#版本中,还可以将属性访问器编写为具有表达式体的成员。

例如以下新的语法糖,减少了编写大括号的需求,并且使用get访问器省略了return关键字:

 1 public class User
 2 {
 3     private string _name;
 4 
 5     public string Name
 6     {
 7         get => _name;
 8         set => _name = value;
 9     }
10 }

自动实现的属性

如果属性的get和set访问器中没有任何逻辑,就可以使用自动属性。

这种属性会自动实现后备成员的变量,例如:

1 public class User
2 {
3     public string Name { get; set; }
4 }

自动属性可以使用属性初始化器来初始化属性值:

public class User
{
    /// <summary>
    /// 默认姓名为小明
    /// </summary>
    public string Name { get; set; } = "小明";
}

属性的访问修饰符

C#允许给属性的get和set访问器设置不同的访问修饰符,所以属性可以有公共的get访问器和私有或受保护的set访问器。

例如以下代码:

public class User
{
    private string _name;
    public string Name
    {
        // get访问器没有任何访问修饰符,这表示get访问器具有属性的访问级别。
        get => _name;
        // set拥有一个私有访问修饰符
        private set => _name = value;
        // get和set访问器必须有一个具有属性的访问级别,不然编译器会报错。
    }
}

只读属性

在属性定义中省略set访问器,就可以创建只读属性。

例如:

public class User
{
    private readonly string _name;
    public string Name
    {
        get => _name;
    }
}

使用readonly修饰符定义的字段,只允许在构造函数中初始化属性的值:

public class User
{
    private readonly string _name;
    public string Name => _name;
    public User(string name)
    {
        _name = name;
    }
}

自动实现的只读属性

C#提供了一个简单的语法,使用自动实现的属性创建只读属性,访问只读字段。这些属性可以使用属性初始化器来初始化。

public class User
{
    public string Id { get; } = Guid.NewGuid().ToString("N");
}

只读属性也可以显示地在构造函数中初始化,例如:

public class User
{
    public string Id { get; }
    public User(string id) => Id = id;
}

表达式体属性

从C#6开始,只有get访问器的属性可以使用表达式体属性实现。

类似于表达式体方法,表达式体属性不需要花括号和返回语句。

表达式体属性带有get访问器的属性,但不限于要编写get关键字。

例如:

 1 public class User
 2 {
 3     public User(string firstName, string lastName)
 4     {
 5         FirstName = firstName;
 6         LastName = lastName;
 7     }
 8     public string FirstName { get; }
 9     public string LastName { get; }
10     public string FullName => $"{FirstName} {LastName}";
11 }
posted @ 2020-04-12 18:19  VTing4You  阅读(206)  评论(1编辑  收藏  举报