C# 中的属性是特殊的方法,该方法只负责对私有字段经行的操作,。因此 形参以及()就可以省略掉了。我们用反编译查看时候看到真实属性是带()的方法,里面还包含get()和set()方法。
属性完成对私有字段的封装。对类的外部用户来说,属性相当一个字段,对类的编写者来说属性就是代码块。真实属性是个无参函数,因此,不能将属性作为 ref 或 out 参数传递。
例如Name属性包含了get_Name()、set_Name()两个方法。
属性的用途:
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);
}
}
编程是个人爱好