C#定义类属性
一、定義屬性
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;
}
}
總結
- 上一篇: 简单的家庭无线路由设置
- 下一篇: jQuery将不再支持IE6/7/8