一、定义属性
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 (new ArgumentOutOfRangeException("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;
}
}