简介:
属性经常与字段连用,并提供了 get 访问器和 set 访问器,分别用于获取或设置字段的值。
get 访问器和 set 访问器的使用与方法非常类似,可以在操作字段时根据一些规则和条件来设置或获取字段的值。
get是读取属性时进行的操作,set是设置属性时进行的操作。定义一个属性如果只有get,这个属性就是只读的。同样,只有set,属性就是只写的,当然只写的属性我觉的意义不是很大。
定义:
public 数据类型 属性名
{
get
{
获取属性的语句块;
return 值;
}
set
{
设置属性得到语句块;
}
}
其中:
1) get{}
get 访问器,用于获取属性的值,需要在 get 语句最后使用 return 关键字返回一个与属性数据类型相兼容的值。
若在属性定义中省略了该访问器,则不能在其他类中获取私有类型的字段值,因此也称为只写属性。
2) set{}
set 访问器用于设置字段的值,这里需要使用一个特殊的值 value,它就是给字段赋的值。
在 set 访问器省略后无法在其他类中给字段赋值,因此也称为只读属性。
通常属性名的命名使用的是 Pascal 命名法,单词的首字母大写,如果是由多个单词构成,每个单词的首字母大写。
由于属性都是针对某个字段赋值的,因此属性的名称通常是将字段中每个单词的首字母大写。例如定义了一个名为 name 的字段,属性名则为 Name。
实例:
定义一个图书信息类(Book),在类中定义图书编号(id)、图书名称(name)、图书价格(price)3 个字段,并分别为这 3 个字段设置属性,其中将图书名称设置为只读属性。
namespace code_1
{
class Book
{
private int id;
private string name;
private double price;
//设置图书编号属性
public int Id
{
get
{
return id;
}
set
{
id = value;
}
}
//设置图书名称属性
public string Name
{
get
{
return name;
}
}
//设置图书价格属性
public double Price
{
get
{
return price;
}
set
{
price = value;
}
}
}
}
在上面的实例中,在给字段赋值时直接将 value 值赋给字段,如果要对赋给字段的值加以限制,可以先判断 value 值是否满足条件,如果满足条件则赋值,否则给字段赋默认值或进行其他操作。
假设上面实例中的图书价格要求是大于 0 的,如果输入的值不满足条件,则将图书价格设置为 0。修改后的图书价格字段的属性代码如下:
public double Price
{
get
{
return price;
}
set
{
if(value >= 0)
{
price = value;
}
else
{
price = 0;
}
}
}
通过上面的实例可以看出,在定义字段属性时,属性的作用就是为字段提供 get、set 访问器,由于操作都比较类似,在 C# 语言中可以将属性的定义简化成如下写法。
public 数据类型 属性名{get;set;}
这种方式也被称为自动属性设置。简化后图书类中的属性设置的代码如下:
- public int Id{get; set;}
- public string Name{get; set;}
- public double Price{get; set;}
如果改为只读属性可以写成如下形式:
- public int Id{get;}=1;
如果不允许其他类访问属性值,则可以在 get 访问器前面加上访问修饰符 private,代码如下:
- public int Id{private get; set;}
总结:
get
关键字在属性或索引器中定义访问器方法,它将返回属性值或索引器元素。
set
关键字在属性或索引器中定义访问器,它会向属性或索引器元素分配值。
下面的示例为名为 Seconds
的属性同时定义 get
和 set
访问器。 它使用名为 _seconds
的私有字段备份属性值。
class TimePeriod
{
private double _seconds;
public double Seconds
{
get { return _seconds; }
set { _seconds = value; }
}
}
通常,get
访问器包含返回一个值的单个语句,set
访问器包含分配一个值的单个语句,如前面的示例所示。 从 C# 7.0 开始,可以将 get
访问器作为 expression-bodied 成员实现。 以下示例将 get
和 set
访问器都作为 expression-bodied 成员实现。
class TimePeriod
{
private double _seconds;
public double Seconds
{
get => _seconds;
set => _seconds = value;
}
}
对于属性的 get
和 set
访问器不执行除设置或检索私有支持字段中的值以外的任何其他操作的简单情况,可以利用 C# 编译器对自动实现的属性的支持。 以下示例将 Hours
作为自动实现的属性来实现。
class TimePeriod2
{
public double Hours { get; set; }
}