C# 中的属性是特殊的方法,该方法只负责对私有字段经行的操作,。因此 形参以及()就可以省略掉了。我们用反编译查看时候看到真实属性是带()的方法,里面还包含get()和set()方法。

属性完成对私有字段的封装。对类的外部用户来说,属性相当一个字段,对类的编写者来说属性就是代码块。真实属性是个无参函数,因此,不能将属性作为 ref 或 out 参数传递。

例如Name属性包含了get_Name()、set_Name()两个方法。

C# 属性_构造函数

 

属性的用途:

1、它们可以先验证数据,再允许进行更改;

2、可以在类上透明地公开数据,其中数据实际是从某个其他源(如数据库)检索到的;

3、可以在数据发生更改时采取措施,例如引发事件或更改其他字段的值。

属性的访问器

属性的访问器有3个:get set init

set 访问器

​set​​ 访问器类似于返回类型为 ​​void​​ 的方法。 它使用名为 ​​value​​ 的隐式参数,该参数的类型为属性的类型。 在下面的示例中,将 ​​set​​ 访问器添加到 ​​Name​​ 属性

 

init 访问器

用于创建 ​​init​​ 访问器的代码与用于创建 ​​set​​ 访问器的代码相同,只不过前者使用的关键字是 ​​init​​ 而不是 ​​set​​。 不同之处在于,​​init​​ 访问器只能在构造函数中使用,或通过对象初始值设定项使用

get 访问器

​get​​ 访问器的正文类似于方法。 它必须返回属性类型的值。 执行 ​​get​​ 访问器等效于读取字段的值

 

 

属性的声明

 



最原始的属性声明
public string Code
{
get
{
return code;
}
set
{
code = value;
}
}
C#6.0 自动实现的属性 ,简化的属性声明
public string Name { get; set; }
public int Age { get; set; }
public int Age => age; //只读Age 属性以表达式主体定义的形式实现
C#7.0引入表达式主体的属性声明
public string Name { get=>name; set=>name=value; }//value是系统自带的关键字,用来个接收外部的赋值。


属性的初始化

构造函数初始化



Cat sameCat = new Cat("Fluffy",10);


用在给对象的属性赋值,替代替代构造函数赋值



Cat cat = new Cat { Age = 10, Name = "Fluffy" };
Cat sameCat = new Cat("Fluffy"){ Age = 10 };


 

抽象类可拥有抽象属性,这些属性应在派生类中被实现

 



abstract class Shape
{
public abstract double Area
{
get;
set;
}
}

class Square : Shape
{
public double side;

//constructor
public Square(double s) => side = s;

public override double Area
{
get => side * side;
set => side = System.Math.Sqrt(value);
}
}


 


编程是个人爱好