C# 屬性 Property
c# 屬性 property
屬性(property) 是類(class)、結構(structure)和接口(interface)的命名(named)成員。類或結構中的成員變量或方法稱為 域(field)。屬性(property)是域(field)的擴展,且可使用相同的語法來訪問。它們使用 訪問器(accessors) 讓私有域的值可被讀寫或操作。
屬性(property)不會確定存儲位置。相反,它們具有可讀寫或計算它們值的 訪問器(accessors)。
例如,有一個名為 student 的類,帶有 age、name 和 code 的私有域。我們不能在類的范圍以外直接訪問這些域,但是我們可以擁有訪問這些私有域的屬性。
1. 訪問器(accessors)
屬性(property)的訪問器(accessor)包含有助于獲取(讀取或計算)或設置(寫入)屬性的可執行語句。訪問器(accessor)聲明可包含一個 get 訪問器、一個 set 訪問器,或者同時包含二者。例如:
// 聲明類型為 string 的 code 屬性 public string code { ? ?get ? ?{ ? ? ? return code; ? ?} ? ?set ? ?{ ? ? ? code = value; ? ?} } // 聲明類型為 string 的 name 屬性 public string name { ? ?get ? ?{ ? ? ?return name; ? ?} ? ?set ? ?{ ? ? ?name = value; ? ?} } // 聲明類型為 int 的 age 屬性 public int age { ? ?get ? ?{ ? ? ? return age; ? ?} ? ?set ? ?{ ? ? ? age = value; ? ?} }
2. 范例
下面的范例演示了屬性(property)的用法:
using system; namespace yapf { ? ?class student ? ?{ ? ? ? private string code = "n.a"; ? ? ? private string name = "not known"; ? ? ? private int age = 0; ? ? ? // 聲明類型為 string 的 code 屬性 ? ? ? public string code ? ? ? { ? ? ? ? ?get ? ? ? ? ?{ ? ? ? ? ? ? return code; ? ? ? ? ?} ? ? ? ? ?set ? ? ? ? ?{ ? ? ? ? ? ? code = value; ? ? ? ? ?} ? ? ? } ? ? ? ? ? // 聲明類型為 string 的 name 屬性 ? ? ? public string name ? ? ? { ? ? ? ? ?get ? ? ? ? ?{ ? ? ? ? ? ? return name; ? ? ? ? ?} ? ? ? ? ?set ? ? ? ? ?{ ? ? ? ? ? ? name = value; ? ? ? ? ?} ? ? ? } ? ? ? // 聲明類型為 int 的 age 屬性 ? ? ? public int age ? ? ? { ? ? ? ? ?get ? ? ? ? ?{ ? ? ? ? ? ? return age; ? ? ? ? ?} ? ? ? ? ?set ? ? ? ? ?{ ? ? ? ? ? ? age = value; ? ? ? ? ?} ? ? ? } ? ? ? public override string tostring() ? ? ? { ? ? ? ? ?return "code = " + code +", name = " + name + ", age = " + age; ? ? ? } ? ? } ? ? class exampledemo ? ? { ? ? ? public static void main() ? ? ? { ? ? ? ? ?// 創建一個新的 student 對象 ? ? ? ? ?student s = new student(); ? ? ? ? ? ? ? ? ? ? ?// 設置 student 的 code、name 和 age ? ? ? ? ?s.code = "001"; ? ? ? ? ?s.name = "zara"; ? ? ? ? ?s.age = 9; ? ? ? ? ?console.writeline("student info: {0}", s); ? ? ? ? ?// 增加年齡 ? ? ? ? ?s.age += 1; ? ? ? ? ?console.writeline("student info: {0}", s); ? ? ? ? ?console.readkey(); ? ? ? ?} ? ?} }
當上面的代碼被編譯和執行時,它會產生下列結果:
student info: code = 001, name = zara, age = 9 student info: code = 001, name = zara, age = 10
3. 抽象屬性(abstract properties)
抽象類可擁有抽象屬性,這些屬性應在派生類中被實現。下面的程序說明了這點:
using system; namespace yapf { ? ?public abstract class person ? ?{ ? ? ? public abstract string name ? ? ? { ? ? ? ? ?get; ? ? ? ? ?set; ? ? ? } ? ? ? public abstract int age ? ? ? { ? ? ? ? ?get; ? ? ? ? ?set; ? ? ? } ? ?} ? ?class student : person ? ?{ ? ? ? private string code = "n.a"; ? ? ? private string name = "n.a"; ? ? ? private int age = 0; ? ? ? // 聲明類型為 string 的 code 屬性 ? ? ? public string code ? ? ? { ? ? ? ? ?get ? ? ? ? ?{ ? ? ? ? ? ? return code; ? ? ? ? ?} ? ? ? ? ?set ? ? ? ? ?{ ? ? ? ? ? ? code = value; ? ? ? ? ?} ? ? ? } ? ? ? ? ? // 聲明類型為 string 的 name 屬性 ? ? ? public override string name ? ? ? { ? ? ? ? ?get ? ? ? ? ?{ ? ? ? ? ? ? return name; ? ? ? ? ?} ? ? ? ? ?set ? ? ? ? ?{ ? ? ? ? ? ? name = value; ? ? ? ? ?} ? ? ? } ? ? ? // 聲明類型為 int 的 age 屬性 ? ? ? public override int age ? ? ? { ? ? ? ? ?get ? ? ? ? ?{ ? ? ? ? ? ? return age; ? ? ? ? ?} ? ? ? ? ?set ? ? ? ? ?{ ? ? ? ? ? ? age = value; ? ? ? ? ?} ? ? ? } ? ? ? public override string tostring() ? ? ? { ? ? ? ? ?return "code = " + code +", name = " + name + ", age = " + age; ? ? ? } ? ?} ? ?class exampledemo ? ?{ ? ? ? public static void main() ? ? ? { ? ? ? ? ?// 創建一個新的 student 對象 ? ? ? ? ?student s = new student(); ? ? ? ? ? ? ? ? ? ? ?// 設置 student 的 code、name 和 age ? ? ? ? ?s.code = "001"; ? ? ? ? ?s.name = "zara"; ? ? ? ? ?s.age = 9; ? ? ? ? ?console.writeline("student info:- {0}", s); ? ? ? ? ?// 增加年齡 ? ? ? ? ?s.age += 1; ? ? ? ? ?console.writeline("student info:- {0}", s); ? ? ? ? ?console.readkey(); ? ? ? ?} ? ?} }
當上面的代碼被編譯和執行時,它會產生下列結果:
student info: code = 001, name = zara, age = 9 student info: code = 001, name = zara, age = 10