標籤:port sys lin 成員 fine obj iii char cep
概述
索引器允許類或結構的執行個體就像數組一樣進行索引。 索引器類似於屬性,不同之處在於它們的訪問器採用參數。
在下面的樣本中,定義了一個泛型類,並為其提供了簡單的 get 和 set 訪問器方法(作為分配和檢索值的方法)。 Program 類為儲存字串建立了此類的一個執行個體。
Code
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 }
索引器和屬性比較
屬性 |
索引器 |
允許像調用公用資料成員一樣調用方法。 |
允許對一個對象本身使用數組標記法來訪問該對象內部集合中的元素。 |
可通過簡單的名稱進行訪問。 |
可通過索引器進行訪問。 |
可以為靜態成員或執行個體成員。 |
必須為執行個體成員。 |
屬性的 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日】
索引器 C#