C# Indexers

An indexer allows us to access instances of a class using an index just like an array.


Define C# Indexer

In C#, we define an indexer just like properties using this keyword followed by [] index notation. For example,

public int this[int index]
{
    get
    {
        return val[index];
    }

    set
    {
        val[index] = value;
    }
}

Here,

  • public - access modifier
  • int - return type of indexer
  • this - indicates we are defining indexer in current class
  • int index - access values using integer index position
  • get - ,method that returns values
  • set - method that assigns values

Example: C# indexer

using System;
class Program
{
    // declare an array to store elements  
    private string[] studentName = new string[10];

// define an indexer public string this[int index] { get { // return value of stored at studentName array return studentName[index]; } set { // assigns value to studentName studentName[index] = value; } }
public static void Main() { // create instance of Program class Program obj = new Program(); // insert values in obj[] using indexer i.e index position obj[0] = "Harry"; obj[1] = "Ron"; obj[2] = "Hermoine"; Console.WriteLine("First element in obj: " + obj[0]); Console.WriteLine("Second element in obj: " + obj[1]); } }

Output

First element in obj: Harry
Second element in obj: Ron

In the above example, notice the code

// declare an array to store elements  
private string[] studentName = new string[10];

Here, we have declared the studentName array of size 10.

Then we have defined an indexer of string type. Notice the code below,

// define an indexer
public string this[int index]
{
    get
    {
        // return value stored at studentName array  
        return studentName[index];
    }

    set
    {
        // assigns value to studentName  
        studentName[index] = value;
    }
}

Here, the set method assigns values to studentName using index. And the get method returns values stored at studentName.

Notice the code,

// create instance of Program class 
Program obj = new Program();

// insert values in obj[] using indexer i.e index position
obj[0] = "Harry";
obj[1] = "Ron";
obj[2] = "Hermoine";

Here, we have used obj (instance of the Program class) like the studentName array.

Note: Without using indexer, we access the studentName array through obj as:

// insert value to studentName array when indexer is not used 
obj.studentName[0] = "Harry";

Indexer helps to simplify the syntax.


Generic Indexer in C#

In C#, we can also use indexers with a generic class. For example,

using System;
class EmployeeInfo<T>
{
    // declare an array to store elements  
    private T[] employee = new T[50];

// define an indexer, // T indicates return type of indexer is generic public T this[int index]
{ get { // return value of stored at studentName array return employee[index]; } set { // assigns value to studentName employee[index] = value; } } } class Program { public static void Main() { // create instance of EmployeeInfo class of int type EmployeeInfo<int> Id = new EmployeeInfo<int>(); // insert integer values in Id[] using indexer i.e index position Id[0] = 3; Id[1] = 23; Id[2] = 10; Console.WriteLine("First element in Id object: " + Id[0]); // create instance of EmployeeInfo class of string type EmployeeInfo<string> Name = new EmployeeInfo<string>(); // insert string values in Name[] using indexer i.e index position Name[0] = "Taylor"; Name[1] = "Selena"; Name[2] = "Joe"; Console.WriteLine("First element in Name object: " + Name[0]); } }

Output

First element in Id object: 3
First element in Name object: Taylor

In the above example, notice the code,

public T this[int index]
{
    get
    {
        // return value of stored at studentName array  
        return employee[index];
    }

    set
    {
        // assigns value to studentName  
        employee[index] = value;
    }
}

Here, we have defined an indexer with return type T which indicates it can return any generic data type.

Also, we have created an instance of the EmployeeInfo class of type int and string. Notice the code,

// create instance of EmployeeInfo class of int type  
EmployeeInfo<int> Id = new EmployeeInfo<int>();

// create instance of EmployeeInfo class of string type 
EmployeeInfo<string> Name = new EmployeeInfo<string>();

Here, the two instances Id and Name are used like an array using index. Notice the code,

// insert integer values in Id[] using indexer i.e index position
Id[0] = 3;

// insert string values in Name[] using indexer i.e index position
Name[0] = "Taylor";
Did you find this article helpful?

Your builder path starts here. Builders don't just know how to code, they create solutions that matter.

Escape tutorial hell and ship real projects.

Try Programiz PRO
  • Real-World Projects
  • On-Demand Learning
  • AI Mentor
  • Builder Community