C# 索引器
阿新 • • 發佈:2020-08-23
C#索引器(Indexer)
索引器(Indexer)允許一個物件可以像陣列一樣被索引。當您為類定義一個索引器時,該類的行為就會像一個虛擬陣列(virtual array)一樣。您可以使用陣列訪問運算子([ ])來訪問該類的例項。
語法
一維索引器的語法如下:
element-type this[int index] { // get 訪問器 get { // 返回 index 指定的值 } // set 訪問器 set { // 設定 index 指定的值 } }
索引器(Indexer)的用途
索引器的行為的宣告在某種程度上類似於屬性(property)。就像屬性(property),您可使用get
定義一個屬性(property)包括提供屬性名稱。索引器定義的時候不帶有名稱,但帶有this關鍵字,它指向物件例項。
class Val { private string type = ""; private int parseId; public Val() { type= "default"; parseId = 114514; } public string getType() { return type; } //主要是用來維護陣列...吧 public string this[int id]{ set { //模擬解析id... type = $"title:{value}="; if (id % 2 == 0) { type += "video"; } else { type +="article"; } } get{ //因為這裡沒有維護一個數組,所以這兩個方法並沒有體現出來具體用處 return type; } } public static bool operator !=(Val va, Val vb) { if (va.getType().Equals(vb.getType())) { return false; } return true; } public static bool operator ==(Val va,Val vb) { if (va.getType().Equals(vb.getType())) { return true; } return false; } } public static void run() { Val valA = new Val(); valA[233] = "wtf this article"; Console.WriteLine(valA.getType()); Val valB = new Val(); valB[234] = "wtf this video"; Console.WriteLine(valB.getType()); Console.WriteLine(valA==valB); }
//果然還是寫個正常的索引器使用例子比較好
過載索引器(Indexer)
索引器(Indexer)可被過載。索引器宣告的時候也可帶有多個引數,且每個引數可以是不同的型別。沒有必要讓索引器必須是整型的。C# 允許索引器可以是其他型別,例如,字串型別。
class Vals { int[] values; string[] names; int size; public Vals() { size = 10; names = new string[10]; values = new int[10]; } public string this[int index] { set { if (index < 0 || index > size - 1) { return; } names[index] = value; } get { return names[index]; } } public int this[string key] { get { for(int i=0;i<size;i++) { if (key.Equals(names[i])) { return values[i]; } } return -1; } set { for (int i = 0; i < size; i++) { if (key.Equals(names[i])) { values[i]= value; } } } } } public static void run() { Val valA = new Val(); valA[233] = "wtf this article"; Console.WriteLine(valA.getType()); Val valB = new Val(); valB[234] = "wtf this video"; Console.WriteLine(valB.getType()); Console.WriteLine(valA==valB); Vals vals = new Vals(); vals[0]= "anyname"; vals["anyname"]= 114514; vals[1] = "testname"; vals["testname"] = 36942; Console.WriteLine(vals["anyname"]); Console.WriteLine(vals["noname"]); }