Indexers (C# Programming Guide)

Updated: July 20, 2015

For the latest documentation on Visual Studio 2017 RC, see Visual Studio 2017 RC Documentation.

Indexers allow instances of a class or struct to be indexed just like arrays. Indexers resemble properties except that their accessors take parameters.

In the following example, a generic class is defined and provided with simple get and set accessor methods as a means of assigning and retrieving values. The Program class creates an instance of this class for storing strings.

    class SampleCollection<T>
        // Declare an array to store the data elements.
        private T[] arr = new T[100];

        // Define the indexer, which will allow client code
        // to use [] notation on the class instance itself.
        // (See line 2 of code in Main below.)        
        public T this[int i]
                // This indexer is very simple, and just returns or sets
                // the corresponding element from the internal array.
                return arr[i];
                arr[i] = value;

    // This class shows how client code uses the indexer.
    class Program
        static void Main(string[] args)
            // Declare an instance of the SampleCollection type.
            SampleCollection<string> stringCollection = new SampleCollection<string>();

            // Use [] notation on the type.
            stringCollection[0] = "Hello, World";
    // Output:
    // Hello, World.

System_CAPS_ICON_note.jpg Note

For more examples, see Related Sections.

It is common to have indexers that simply return immediately with the result of an expression. There is a syntax shortcut for defining these indexers using =>:

public Customer this[long id] => store.LookupCustomer(id);  

The indexer must be read only, and you do not use the get accessor keyword.

  • Indexers enable objects to be indexed in a similar manner to arrays.

  • A get accessor returns a value. A set accessor assigns a value.

  • The this keyword is used to define the indexers.

  • The value keyword is used to define the value being assigned by the set indexer.

  • Indexers do not have to be indexed by an integer value; it is up to you how to define the specific look-up mechanism.

  • Indexers can be overloaded.

  • Indexers can have more than one formal parameter, for example, when accessing a two-dimensional array.

For more information, see the C# Language Specification. The language specification is the definitive source for C# syntax and usage.

C# Programming Guide