索引器容許類或結構的實例就像數組同樣進行索引。 索引器相似於屬性,不一樣之處在於它們的訪問器採用參數。html
在下面的示例中,定義了一個泛型類,併爲其提供了簡單的 get 和 set 訪問器方法(做爲分配和檢索值的方法)。 Program 類爲存儲字符串建立了此類的一個實例。數組
1 class SampleCollection<T>
2 {
3 // Declare an array to store the data elements.
4 private T[] arr = new T[100];
5
6 // Define the indexer, which will allow client code
7 // to use [] notation on the class instance itself.
8 // (See line 2 of code in Main below.)
9 public T this[int i]
10 {
11 get
12 {
13 // This indexer is very simple, and just returns or sets
14 // the corresponding element from the internal array.
15 return arr[i];
16 }
17 set
18 {
19 arr[i] = value;
20 }
21 }
22 }
23
24 // This class shows how client code uses the indexer.
25 class Program
26 {
27 static void Main(string[] args)
28 {
29 // Declare an instance of the SampleCollection type.
30 SampleCollection<string> stringCollection = new SampleCollection<string>();
31
32 // Use [] notation on the type.
33 stringCollection[0] = "Hello, World";
34 System.Console.WriteLine(stringCollection[0]);
35 }
36 }
屬性dom |
索引器ide |
---|---|
容許像調用公共數據成員同樣調用方法。post |
容許對一個對象自己使用數組表示法來訪問該對象內部集合中的元素。ui |
可經過簡單的名稱進行訪問。this |
可經過索引器進行訪問。lua |
能夠爲靜態成員或實例成員。spa |
必須爲實例成員。debug |
屬性的 get 訪問器沒有參數。 |
索引器的 get 訪問器具備與索引器相同的形參表。 |
屬性的 set訪問器包含隱式 value 參數。 |
除了值參數外,索引器的 set 訪問器還具備與索引器相同的形參表。 |
支持對自動實現屬性使用短語法。 |
不支持短語法。 |
索引器可在接口上聲明。 接口索引器的訪問器與類索引器的訪問器具備如下方面的不一樣:
接口訪問器不使用修飾符。
接口訪問器沒有體。
所以,訪問器的用途是指示索引器是讀寫、只讀仍是隻寫。
接口索引器訪問器的示例:
1 public interface ISomeInterface
2 {
3 //...
4
5 string this[int index]
6 {
7 get;
8 set;
9 }
10 }
1 // Indexer on an interface:
2 public interface ISomeInterface
3 {
4 // Indexer declaration:
5 int this[int index]
6 {
7 get;
8 set;
9 }
10 }
11
12 // Implementing the interface.
13 class IndexerClass : ISomeInterface
14 {
15 private int[] arr = new int[100];
16 public int this[int index] // indexer declaration
17 {
18 get
19 {
20 // The arr object will throw IndexOutOfRange exception.
21 return arr[index];
22 }
23 set
24 {
25 arr[index] = value;
26 }
27 }
28 }
29
30 class MainClass
31 {
32 static void Main()
33 {
34 IndexerClass test = new IndexerClass();
35 System.Random rand = new System.Random();
36 // Call the indexer to initialize its elements.
37 for (int i = 0; i < 10; i++)
38 {
39 test[i] = rand.Next();
40 }
41 for (int i = 0; i < 10; i++)
42 {
43 System.Console.WriteLine("Element #{0} = {1}", i, test[i]);
44 }
45
46 // Keep the console window open in debug mode.
47 System.Console.WriteLine("Press any key to exit.");
48 System.Console.ReadKey();
49 }
50 }
51 /* Sample output:
52 Element #0 = 360877544
53 Element #1 = 327058047
54 Element #2 = 1913480832
55 Element #3 = 1519039937
56 Element #4 = 601472233
57 Element #5 = 323352310
58 Element #6 = 1422639981
59 Element #7 = 1797892494
60 Element #8 = 875761049
61 Element #9 = 393083859
62 */
在上例中,能夠經過使用接口成員的徹底限定名來使用顯式接口成員實現。 例如:
1 public string ISomeInterface.this
2 {
3 }
可是,只有當類使用同一索引器簽名實現一個以上的接口時,爲避免多義性才須要使用徹底限定名。 例如,若是 Employee 類實現的是兩個接口 ICitizen 和IEmployee,而且這兩個接口具備相同的索引器簽名,則必須使用顯式接口成員實現。 即,如下索引器聲明:
1 public string IEmployee.this
2 {
3 }
在 IEmployee 接口上實現索引器,而如下聲明:
1 public string ICitizen.this
2 {
3 }
在 ICitizen 接口上實現索引器。
【本文由「白字先生」發佈,2017年05月08日】