C#定义类属性
一、定義屬性
1.屬性擁有兩個(gè)類似于函數(shù)的代碼塊,一個(gè)用于獲取屬性的值(get),一個(gè)用于設(shè)置屬性的值(set),這兩個(gè)塊也稱為訪問器,可以用于控制對(duì)屬性的訪問級(jí)別。
2.屬性至少要包含一個(gè)塊才是有效的,可以忽略其中一個(gè)來創(chuàng)建只讀(只有g(shù)et塊)或只寫(只有set塊)屬性。當(dāng)然,這僅適用于外部代碼,因?yàn)轭愔械拇a可以訪問這些塊能訪問的數(shù)據(jù)。
3.可以在訪問器上包含可訪問關(guān)鍵字,如使get塊變成公共的,把set塊變成受保護(hù)的。
4.屬性的基本結(jié)構(gòu)包括標(biāo)準(zhǔn)的要可訪問關(guān)鍵字(public、private等)后跟類名、屬性名和get塊/set塊,語法:
public int MyIntProp
{
get {}
set {}
}
注:定義屬性的第一行非常類似于定義字段,區(qū)別是行末沒有分號(hào)。
5.get塊必須有一個(gè)屬性類型的返回值。簡單的屬性一般與一個(gè)私有字段相關(guān)聯(lián),以控制對(duì)這個(gè)字段的訪問,此時(shí)get塊可以直接返回該字段的值。
如:private int myInt;??? //定義字段
??? public int MyIntProp//定義屬性
{
get{ return myInt; }
}
6.set塊以類似的方式把一個(gè)值賦給字段,這里可以使用關(guān)鍵字value引用用戶提供的屬性值,并可以對(duì)value進(jìn)行判斷等**作。
如:private int myInt;??? //定義字段
??? public int MyIntProp//定義屬性
{
get{ return myInt; }
set{ if (value >= 0 && value <= 10)myInt = value; }
}
注:當(dāng)賦給屬性的值超出set 代碼中限定的時(shí)候,可以有四種方法進(jìn)行處理:
?? 什么也不做(如上述代碼所示);
?? 給字段賦默認(rèn)值;
?? 繼續(xù)執(zhí)行,就好像沒有發(fā)生錯(cuò)誤一樣,但記錄下該事件,以備將來分析;
?? 拋出一個(gè)異常;
一般情況下,后兩種方法比較好。采用第四種方法時(shí),可使用標(biāo)準(zhǔn)的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關(guān)鍵字,就像方法一樣,但這幾個(gè)關(guān)鍵字不能用于字段。
8.訪問器可以使用什么可訪問的關(guān)鍵字,取決于屬性的可訪問性。訪問器的可訪問性不能高于它所屬的屬性,也就是說,私有屬性對(duì)它的訪問器不能包含任何可訪問關(guān)鍵字
?
旅館對(duì)住宿人員進(jìn)行登記,要記錄的信息有:客人姓名、性別、所住的房間號(hào)、已住宿的天數(shù)。這里,客人的姓名和性別一經(jīng)確定就不能理更改了,用戶可以要求改變房間,住宿的天數(shù)當(dāng)然也是不斷變化的。我們?cè)陬惖臉?gòu)造函數(shù)中對(duì)客人的姓名和性別進(jìn)行初始化,在四個(gè)屬性中,客人的姓名和性別是只讀的,故只具有g(shù)et訪問器;房間號(hào)和住宿天數(shù)允許改變,同時(shí)具有set訪問器和get訪問器。
?
using System;
class Program
{
static void Main()
{
?? Customer c=new Customer("王玉珍",Customer.sex.女,"7",10);
?? Console.WriteLine("旅館住宿人員的姓名為{0},姓名為{1},門牌號(hào)碼{2},共住了{(lán)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;
}
}
總結(jié)
- 上一篇: 简单的家庭无线路由设置
- 下一篇: jQuery将不再支持IE6/7/8