屬性可以是 類(class)、結構(struct)、接口(interface)的命名成員,他提供靈活的機制來讀取、寫入、或計算私有(private)字段的值,屬性可以看作是公共(public)字段的成員,但他實際上是定義了一個“訪問器”的特殊方法讓私有字段的值可以被讀寫或操作。
說的形象點吧,比如我們定義一個person類裡面有一個私有成員 private string name; 在外界我們實例化一個person對象per,要求為per起個名字,並且輸出這個名字,也就是為per.name賦一個值,然後輸出??經過前面的學習我們知道,類中的private修飾的變量外界對象是訪問不到的,(無法直接per.name=HC666來搞定^_^) 因此只能在類裡面定義一個public修飾的setname與getname方法將“HC666”作為參數來進行寫入與輸出,這樣有點繁瑣,這個時候“屬性”就該登場了,我們為name定義一個讀寫屬性Name就可以彌補這個不足。
屬性的訪問器包含有獲取或者設置屬性的可執行語句,訪問器的聲明可包含一個get訪問器(表示只讀),或者一個set訪問器(表示只寫),或者兩個同時包含(表示可讀可寫)。(上面的例子中我們使用get訪問器輸出name,使用set訪問器寫入)
上面的例子中我們可以為name 定義一個讀寫屬性Name,使用外界對象能夠訪問的public修飾符
private string name; //聲明name變量
public string Name //聲明變量的屬性,讀寫
{
get { return name; } //定義讀訪問器,其實就是一個方法
set { name = value; } //定義寫訪問器,set 方法有一個隱含的參數value
}
再定義一個只讀屬性吧,比如我們的年齡 age 是固定的只讀
private uint age=10; //聲明變量 age
private string Age //聲明變量的屬性,只讀
{
get { return age; } //讀訪問器
}
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test1 { class person { //定義變量name,並且為name定義一個讀寫屬性 private string name; //定義屬性 public string Name {//訪問器 get { return name; } set { name = value; } //set自帶一個value參數 } //定義變量age,並且為age定義一個只讀屬性 private uint age=10; public uint Age { get { return age; } } } class Program { static void Main(string[] args) { person per = new person(); per.Name = HC666; //執行寫入屬性 Console.WriteLine(我的名字叫:{0} 今年 {1} 歲了,per.Name,per.Age); //讀屬性 } } }
結果:
前面也說了,屬性可以使類、結構、接口的成員,自然也可以是抽象類的抽象屬性了,抽象屬性同抽象方法一樣在派生類中被實現。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test1 {//定義一個person抽象類 abstract class person {//定義抽象屬性 public abstract string Name {//讀寫 get; set; } public abstract uint Age {//只讀 get; } } //定義派生類 class student : person { private string name; private uint age=10; //實現抽象屬性 public override string Name { get { return name ; } set { name=value; } } public override uint Age { get { return age; } } } class Program { static void Main(string[] args) { student stu = new student(); stu.Name = HC666; //執行寫入屬性 Console.WriteLine(我的名字叫:{0} 今年 {1} 歲了,stu.Name,stu.Age); //讀屬性 } } }
結果與上一個例子是一樣的。