Indexer In .NET
Indexers provide a natural syntax for accessing elements in a class or struct that encapsulate a list or dictionary of values. Indexers are similar to properties, but are accessed via an index argument rather than a property name. The string class has an indexer that lets you access each of its char values via an int index:
string s = "hello";
Console.WriteLine (s[0]); // 'h'
Console.WriteLine (s[3]); // 'l'
The syntax for using indexers is like that for using arrays when the index is an integer type.
Implementing an indexer
To write an indexer, define a property called this, specifying the arguments in square brackets. For instance:
class Sentence
{
string[] words = "The quick brown fox".Split();
public string this [int wordNum] // indexer
{
get { return words [wordNum]; }
set { words [wordNum] = value; }
}
}
Here’s how we could use this indexer:
Sentence s = new Sentence();
Console.WriteLine (s[3]); // fox
s[3] = "kangaroo";
Console.WriteLine (s[3]); // kangaroo
A type may declare multiple indexers, each with parameters of different types. An
indexer can also take more than one parameter:
public string this [int arg1, string arg2]
{
get { ... } set { ... }
}
If you omit the set accessor, an indexer becomes read-only.
CLR indexer implementation
Indexers internally compile to methods called get_Item and set_Item, as follows:
public string get_Item (int wordNum) {...}
public void set_Item (int wordNum, string value) {...}
The compiler chooses the name “Item” by default—you can actually change this by
decorating your indexer with the following attribute:
[System.Runtime.CompilerServices.IndexerName ("Blah")]