標籤:blog 資料 io cti html re
前沿:
索引器:索引器允許類或結構的執行個體就像數組一樣進行索引。 索引器類似於屬性,不同之處在於它們的訪問器採用參數。
本文:
在看索引器前,我們先看看C#的屬性,物件導向設計和編程的重要原則之一就是資料封裝,也就是我們在類中定義的欄位永遠不應該對外公開,假如我們定義了下面一個類
public class Employee{ public string Name; public int Age;}
那麼我們在外面可以很隨意的破換一個Employee對象:
Employee e=new Employee();e.Age=-1;
這裡我們可以看出來,年齡為-1是不符合邏輯的,年齡一般只有自己知道,自己可以隨便說出一個範圍(小姐,你今年多大了?——————我18)。所以我們一般是會把欄位定義為私人的,外部想要訪問可以,我可以給你一個公開的方法,但我自己規定我的年齡範圍,你只能在這個範圍裡面來猜測測。
class Employee { private string name; private Int32 age; public void SetAge(Int32 value) { if (value < 0) throw new ArgumentOutOfRangeException("年齡不能為小於0"); age = value; } public Int32 GetAge() { return age; } }
這樣我們就實現了資料欄位的封裝,當你試圖給欄位提供一個不合理的數值時,就會拋出異常,但這裡卻多出了兩個方法,也就是說我們不得不實現額外的方法來封裝我們的欄位。於是C#就提供了屬性,額外的方法預設有編譯器提供,我們只需要這樣來定義就可以了
public Int32 Age { get { return age; } set { if (value < 0) throw new ArgumentOutOfRangeException("年齡不能小於0"); age = value; } }
以上就是無參屬性(為什麼稱為無參屬性,是因為這裡我們的get訪問器方法是不接受參數的,我們直接返回特定的一個欄位值),也就是我們經常定義的對象屬性,既然有無參屬性,那麼隨之對應的就應該是有參屬性。
有參屬性:(也就是索引器了)
有參屬性,他的get訪問器可以接受一個或多個參數,set 訪問器可以接受兩個或多個參數:下面我們看一個例子,這個類允許以數組風格的文法來索引由這個類的一個執行個體維護的一個數組。
class SampleCollection<T> { // Declare an array to store the data elements. private T[] arr = new T[100]; public T this[int i] { get { return arr[i]; } set { arr[i] = value; } } } class Program { static void Main(string[] args) { // Declare an instance of the SampleCollection type. SampleCollection<string> stringCollection = new SampleCollection<string>(); // Use [] notation on the type. stringCollection[0] = "Hello, World"; System.Console.WriteLine(stringCollection[0]); } }
這裡給出一個動態切換語言版本的一個執行個體
public class LanguageManager { private static LanguageManager instance = new LanguageManager(); public static LanguageManager Instance { get { return instance; } } public IList<LangInfo> Langs { get; private set; } private LanguageManager() { Langs = new LangInfo[] { new LangInfo() { Name = "中文", Uri = new Uri(/Lang/zh-cn.xaml", UriKind.RelativeOrAbsolute), CultureInfo = new System.Globalization.CultureInfo("zh-cn"), }, new LangInfo() { Name="English", Uri = new Uri("、Lang/en-us.xaml", UriKind.RelativeOrAbsolute), CultureInfo = new System.Globalization.CultureInfo("en-us"), }, }; } public LangInfo this[string name] { get { return Langs.SingleOrDefault(l => l.Name == name); } } public LangInfo this[int i] { get { return Langs[i]; } } }
Uri uri = LanguageManager.Instance[lang].Uri;
希望對你有一點點協助(其實,有時候學習一個知識點是很容易的,關鍵是你要知道怎麼用,以及什麼場合下用就不容易了,還需要慢慢體會)!