一、定义属性
1.属性拥有两个类似于函数的代码块,一个用于获取属性的值(get),一个用于设置属性的值(set),这两个块也称为访问器,可以用于控制对属性的访问级别。
2.属性至少要包含一个块才是有效的,可以忽略其中一个来创建只读(只有get块)或只写(只有set块)属性。当然,这仅适用于外部代码,因为类中的代码可以访问这些块能访问的数据。
3.可以在访问器上包含可访问关键字,如使get块变成公共的,把set块变成受保护的。
4.属性的基本结构包括标准的要可访问关键字(public、private等)后跟类名、属性名和get块/set块,语法:
public int MyIntProp
{
get {}
set {}
}
注:定义属性的第一行非常类似于定义字段,区别是行末没有分号。
5.get块必须有一个属性类型的返回值。简单的属性一般与一个私有字段相关联,以控制对这个字段的访问,此时get块可以直接返回该字段的值。
如:private int myInt; //定义字段
public int MyIntProp//定义属性
{
get{ return myInt; }
}
6.set块以类似的方式把一个值赋给字段,这里可以使用关键字value引用用户提供的属性值,并可以对value进行判断等**作。
如:private int myInt; //定义字段
public int MyIntProp//定义属性
{
get{ return myInt; }
set{ if (value >= 0 && value <= 10)myInt = value; }
}
注:当赋给属性的值超出set 代码中限定的时候,可以有四种方法进行处理:
什么也不做(如上述代码所示);
给字段赋默认值;
继续执行,就好像没有发生错误一样,但记录下该事件,以备将来分析;
抛出一个异常;
一般情况下,后两种方法比较好。采用第四种方法时,可使用标准的System异常。
如:set{
if (value >= 0 && value <= 10) intVal = value;
else
throw (newArgumentOutOfRangeException("Val", value, "Val must be assigned a value between 0 and 10."));
}
可以在使用属性的代码中通过try…catch…finally逻辑来处理。
7.属性可以使用virtual,override和abstract关键字,就像方法一样,但这几个关键字不能用于字段。
8.访问器可以使用什么可访问的关键字,取决于属性的可访问性。访问器的可访问性不能高于它所属的属性,也就是说,私有属性对它的访问器不能包含任何可访问关键字
旅馆对住宿人员进行登记,要记录的信息有:客人姓名、性别、所住的房间号、已住宿的天数。这里,客人的姓名和性别一经确定就不能理更改了,用户可以要求改变房间,住宿的天数当然也是不断变化的。我们在类的构造函数中对客人的姓名和性别进行初始化,在四个属性中,客人的姓名和性别是只读的,故只具有get访问器;房间号和住宿天数允许改变,同时具有set访问器和get访问器。
using System;
class Program{ static void Main(){ Customer c=new Customer("王玉珍",Customer.sex.女,"7",10); Console.WriteLine("旅馆住宿人员的姓名为{0},姓名为{1},门牌号码{2},共住了{3}天。",c.Name,c.Sex,c.No,c.Day); Console.ReadKey();}}public class Customer{ public enum sex{ 男, 女};public string s_name;public string Name{ get { return s_name; }}private sex m_sex;public sex Sex{ get { return m_sex; }}private string s_no;public string No{ get { return s_no; } set { if (s_no != value) { s_no = value; } }}private int i_day;public int Day{ get { return i_day; } set { if (i_day != value) { i_day = value; } }}public Customer(string name, sex sex, string no, int day){ s_name = name; m_sex = sex; s_no = no; i_day = day;}}