2.5C#函数成员之属性(Property)

1.属性声明

属性的声明方式与字段相似,区别是属性声明以在分隔符 { 和 } 之间写入的 get 访问器或 set 访问器结束,而不是以分号结束。

属性需与字段配套使用,字段是数据成员(定义存储位置),而属性是为了操作private字段而生的函数成员(不定义存储位置)。

//常规语法
public class Person
{
    public string FirstName
    {
        get { return firstName; }
        set { firstName = value; }
    }

    private string firstName;
}
//Expression-bodied表达式声明法
public class Person
{
    public string FirstName
    {
        get => firstName;
        set => firstName = value;
    }

    private string firstName;
}

自动实现的属性语法会自动生成支持此属性的字段的存储位置并自动实现 getset 访问器,无需显式声明字段。

getset访问器(或 getinit访问器)只要书写其中一个并且未实现代码即为自动实现的属性

//自动实现的属性语法
public class Person
{
    public string FirstName { get; set; }
}

2.属性分类

名称修饰符
静态属性static 修饰
实例属性static 修饰

3.访问器

属性通过访问器实现,访问器用于定义访问属性或为属性赋值时执行的语句,get 访问器读取该值,set 访问器写入该值,可以使用 init 访问器代替 set 访问器用于仅在对象构造过程中初始化分配新值。

get 访问器是没有参数且返回类型为属性类型的方法,而set 访问器是value参数且返回值为void的方法。

同时具有 get 访问器和 set 访问器的属性是 读写属性,只有一个 get 访问器的属性是 只读属性,只有一个 set 访问器的属性是 只写属性

4.只读属性

字段可以通过readonly将字段声明为只读字段,属性可以通过访问器来将属性声明为只读属性

编译器会将自动实现的属性的 get 访问器隐式声明为 readonly,而不管属性声明中是否存在 readonly 修饰符。

//常规语法
public class Person
{
    public Person(string firstName) => this.FirstName = firstName;

    public string FirstName { get; }
}
//Expression-bodied表达式声明法
public class Location
{
   private string locationName;

   public Location(string name)
   {
      locationName = name;
   }

   public string Name => locationName;
}

5.抽象属性

声明抽象属性时(如本示例中的 Area),只需指明哪些属性访问器可用即可,不要实现它们。在此示例中,仅 get 访问器可用,因此该属性是只读属性。

public abstract double Area
{
    get;
}
public override double Area
{
    get
    {
        // Given the side, return the area of a square:
        return side * side;
    }
}

6.修饰符

属性其余还支持 new、override、sealed、virtual 修饰符。

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/csharp/csharplang/8256.html

(0)
上一篇 2021年2月5日 15:50
下一篇 2021年2月6日 02:44

相关推荐

发表回复

登录后才能评论