Summary: in this tutorial, you’ll learn how to use the C# indexer to make an object indexed like an array.
Introduction to the C# indexer
An index allows an object of a class to be indexed like an array. To define an indexer for a class, you use the following syntax:
class MyClass { public type this[int index] { get { // return a value } set { // assing a value } } }
Code language: C# (cs)
The syntax of an indexer is like a property except that its accessor takes a parameter:
- First, define the
type
of the return value. - Second, define the indexer using the use
this
keyword. - Third, define a parameter of the indexer. The parameter doesn’t have to be an integer. The parameter’s type depends on how you design the look-up mechanism. Also, an indexer can have more than one parameter.
- Finally, define the
get
andset
accessors. Theget
accessor returns a value while theset
accessor assigns a value. If the indexer doesn’t have theset
accessor, it’s a readonly indexer.
Note that indexers can be overloaded. In other words, a class can have multiple indexers.
If you omit the set
accessor, the indexer becomes read-only. In this case, you can use expression-bodied syntax to shorten its definition:
class MyClass { public type this[int index] => returnValue; }
Code language: C# (cs)
Note that you don’t need to use the get
keyword.
Starting with C# 7, you can use expression-bodied syntax for both get
and set
accessors. However, you need to use the get
and set
keywords in this case:
class MyClass { public type this[int i] { get => member[i]; set => member[i] = value; } }
Code language: C# (cs)
C# indexer examples
Let’s take some examples of using indexers.
1) C# readonly indexer example
Suppose you have a sentence like the following:
"C# is awesome"
Code language: C# (cs)
And you want to access each word of the sentence using an index. For example:
sentence[0]
Code language: C# (cs)
It should return the first word (C#
), not the first character (C
):
"C#"
Code language: C# (cs)
To do that, you can define a new class and use an indexer.
First, create a new file called Sentence.cs
.
Second, define the Sentence
class in the Sentence.cs
file:
// Sentence.cs class Sentence { private string[] words; public Sentence(string s) { words = s.Split(' '); } }
Code language: C# (cs)
The Sentence()
constructor splits an input string by the space into words and assigns the result to the words
field.
Third, define an indexer in the Sentence
class:
// Sentence.cs class Sentence { private string[] words; public Sentence(string s) { words = s.Split(' '); } public string this[int index] { get { return words[index]; } } }
Code language: C# (cs)
In this example, the indexer returns the word in the sentence based on an index.
The following illustrates how to use the indexer of the sentence’s object:
// Program.cs var sentence = new Sentence("C# is awesome"); Console.WriteLine(sentence[0]); Console.WriteLine(sentence[1]); Console.WriteLine(sentence[2]);
Code language: C# (cs)
Output:
C# is awesome
Code language: C# (cs)
Because the indexer in the Sentence
class is read-only, you can shorten it using the expression-bodied syntax like this:
// Sentence.cs class Sentence { private string[] words; public Sentence(string s) { words = s.Split(' '); } public string this[int index] => words[index]; }
Code language: C# (cs)
2) C# indexer example with set and get accessors
The following example defines the class Matrix
that uses a multidimensional array as a field and an indexer to access its elements:
// Matrix.cs class Matrix { private double[,] data; public Matrix(int row, int column) { data = new double[row, column]; } public double this[int row, int column] { get { return data[row, column]; } set { data[row, column] = value; } } }
Code language: JavaScript (javascript)
Now, you can use the Matrix’s object like an array like this:
// Program.cs var matrix = new Matrix(3,3); for (int row = 0; row < 3; row++) { for (int column = 0; column < 3; column++) { matrix[row, column] = row + column; } } for (int row = 0; row < 3; row++) { for (int column = 0; column < 3; column++) { Console.Write($"{matrix[row, column]} "); } Console.WriteLine(); }
Code language: JavaScript (javascript)
Output:
0 1 2 1 2 3 2 3 4
Note that you can use the expression-bodied syntax for the get
and set
accessors of the indexer.
Summary
- Use C# indexer to enable an object to be indexed like an array.