第10章 属性
一.无参属性
通常被称为属性.
面向对象设计和编程的其中一个原则是数据封装.

Code
1
public class Employee
2
{
3
private string _name;
4
private int _age;
5
6
public string Name
7
{
8
get
9
{
10
return _name;
11
}
12
set
13
{
14
this._name = value;
15
}
16
}
17
public int Age
18
{
19
get
20
{
21
return _age;
22
}
23
set
24
{
25
if (value < 0)
26
{
27
throw new ArgumentOutOfRangeException("年龄不可能为负数");
28
}
29
else
30
this._age = value;
31
}
32
}
33
34
}
如果不封装,比如上面的年龄:就会有如下代码:

Code
public int height;//体重
static void Main(string[] args)
{
Employee employee = new Employee();
employee.Age = 12;
employee.Name = "dreamersjun";
employee.height = -12;//体重不会出现负数
Console.WriteLine(employee.Age);
Console.WriteLine(employee.Name);
//employee.Age = -1;
}
所以尽可能的封装字段.
当定义一个属性时,编译器会在生成的托管模块中产生以下3项:
1.一个表示属性的get访问器的方法.只有在为属性定义了get访问器方法时,才有这一项.
2.一个表示属性的set访问器的方法,只有在为属性定义了set访问器方法时,才有这一项.
3.一个位于托管模块元数据中的属性定义,不管是只读,只写,或者是读写属性都有这一项.
属性限制:
第一:属性不定义存储位置,所以不能以ref或out参数的形式传递给方法.
第二:属性不能重载.
第三:当调用get访问器时,属性不应该再改变存储变量的状态.
二:含参属性
在C#中称为索引器.通过索引器访问的每个元素都应该和索引器的基类型一致.参数index不必须是int类型,但因为索引器通常用于数组索引,所以index通常为int.
set访问器能接收隐含参数value,该参数包含赋给指定下标的元素的值.
使用索引器有两个限制.第一,因为索引器没有定义存储位置,所以索引器产生的值不能作为 ref参数或out参数传递给方法.第二:索引器必须是类的实例成员,不能被声明为static类型.
三:对访问器使用访问限定符
第一:只能改变set或get访问器之一的访问限定符,而不能是两者.
第二:访问限定符必须比属性或索引器的访问限制更严格.