Indexers
Indexers allow you to access an element of a private array or collection field. When you indicate an index for an instance of a class, indexers will get the right data indicated by the index. The following program shows an example of an indexer:
using System;
namespace IndexersDemo
{
public class Person
{
private string[] friends;
//Constructor to add friends
public Person(params string[] friends)
{
this.friends = friends;
}
//This is the indexer
public string this[int index]
{
get { return friends[index]; }
set { friends[index] = value; }
}
}
public class Program
{
public static void Main()
{
//Create a new person and add some friends
Person person = new Person("Jenny", "Robert", "Susan", "Charles", "Mandy");
for (int i = 0; i < 5; i++)
{
//You can now access each element of the
// private field by specifying the index
Console.WriteLine(person[i]);
}
//Changing the second element to John
person[1] = "John";
}
}
}
Example 1 – Indexers Demo
Jenny Robert Susan Charles Mandy
We created a class containing a private array that will store the friends of the Person instance (line 7). We also defined a constructor that will accept string values and assign them to the friends field (lines 10-13). We defined an indexer (lines 16-20) for the specified class. The indexer is just like a property, but instead of indicating a name, we used the this keyword and a parameter that will determine the index. We then provide the setters and getters. Inside the getter, we return the array element specified by the value of index. Inside the setter, we assigned the value to the element indicated by the index.
We then created an instance of that class and gave some values as friends of the Person object (line 28). We queried all the elements of the private friends field of the instance using a for loop (lines 30-35). Notice that we didn’t indicate any properties to get the values. We simply call the value of the element by specifying the index inside square brackets next to the name of the instance just like how we access array elements. You can also use the same referencing technique when assigning values to private array or collection fields. Without indexers, then we have to create a public property for the friends field.
public string[] Friends
{
get { return friends; }
set { friends = value; }
}
And you access the private array field by using the above property.
Console.WriteLine(person1.Friends[0]);
person1.Friends[1] = "John";
One disadvantage of indexers is that you can only create one indexer per class. For example, if you have private fields named friends and classmates, you need to choose which to put indexer among those private fields. It is better to provide an indexer to an array field that is most useful for the class and then provide public properties for all the private arrays and collections including the one that has given an indexer.
Note that you can also use string type as the index. This can be used if you are accessing a Dictionary inside your class. Dictionaries will be discussed in later lessons.