C# indexer
The Indexer allows an object to be accessed in the same way as an array using a subscript.
When you define an indexer for a class, the class behaves like a virtual array. You can use arrays to access operators [ ]
to access members of this class.
Grammar
The syntax of an one-dimensional indexer is as follows:
element-type this[int index]
{
// get accessor
get
{
// returns the value specified by index
}
// set accessor
set
{
// set the value specified by index
}
}
The purpose of the indexer
The declaration of the indexer’s behavior is somewhat similar to a property.Like property, you can use the get
and set
accessor to define theindexer. However, the property returns or sets a specific data member, and the indexer returns or sets a specific value for the object instance. In other words, it divides the instance data into smaller parts, indexes each part, and gets or sets each part.
Defining an property includes providing the name of the attribute. Indexers are defined without a name, but with this
keyword, which points to the object instance. The following example demonstrates this concept:
Example
using System;
namespace IndexerApplication
{
class IndexedNames
{
private string[] namelist = new string[size];
static public int size = 10;
public IndexedNames()
{
for (int i = 0; i < size; i++)
namelist[i] = "N. A.";
}
public string this[int index]
{
get
{
string tmp;
if( index >= 0 && index <= size-1 )
{
tmp = namelist[index];
}
else
{
tmp = "";
}
return ( tmp );
}
set
{
if( index >= 0 && index <= size-1 )
{
namelist[index] = value;
}
}
}
static void Main(string[] args)
{
IndexedNames names = new IndexedNames();
names[0] = "Zara";
names[1] = "Riz";
names[2] = "Nuha";
names[3] = "Asif";
names[4] = "Davinder";
names[5] = "Sunil";
names[6] = "Rubic";
for ( int i = 0; i < IndexedNames.size; i++ )
{
Console.WriteLine(names[i]);
}
Console.ReadKey();
}
}
}
When the above code is compiled and executed, it produces the following results:
Zara
Riz
Nuha
Asif
Davinder
Sunil
Rubic
N. A.
N. A.
N. A.
Overloaded indexer
The indexer can be overloaded. Indexers can also be declared with multiple parameters, and each parameter can be of a different type. There isno need for indexers to be integer. C# allows indexers to be of other types, such as string types.
The following example demonstrates the overloaded indexer:
Example
using System;
namespace IndexerApplication
{
class IndexedNames
{
private string[] namelist = new string[size];
static public int size = 10;
public IndexedNames()
{
for (int i = 0; i < size; i++)
{
namelist[i] = "N. A.";
}
}
public string this[int index]
{
get
{
string tmp;
if( index >= 0 && index <= size-1 )
{
tmp = namelist[index];
}
else
{
tmp = "";
}
return ( tmp );
}
set
{
if( index >= 0 && index <= size-1 )
{
namelist[index] = value;
}
}
}
public int this[string name]
{
get
{
int index = 0;
while(index < size)
{
if (namelist[index] == name)
{
return index;
}
index++;
}
return index;
}
}
static void Main(string[] args)
{
IndexedNames names = new IndexedNames();
names[0] = "Zara";
names[1] = "Riz";
names[2] = "Nuha";
names[3] = "Asif";
names[4] = "Davinder";
names[5] = "Sunil";
names[6] = "Rubic";
// Using the first indexer with an int parameter
for (int i = 0; i < IndexedNames.size; i++)
{
Console.WriteLine(names[i]);
}
// Using a second indexer with a string parameter
Console.WriteLine(names["Nuha"]);
Console.ReadKey();
}
}
}
When the above code is compiled and executed, it produces the following results:
Zara
Riz
Nuha
Asif
Davinder
Sunil
Rubic
N. A.
N. A.
N. A.
2