C-Sharp | Java | Python | Swift | GO | WPF | Ruby | Scala | F# | JavaScript | SQL | PHP | Angular | HTML
Layout: This program includes a Layout class with an indexer. Layout contains an indexer that has get and set method bodies.
Logic: These accessors have logic that ensures the array will not will be accessed out-of-bounds.
Note: The array is termed the backing store for the indexer property in this example.
ArrayWriteLine: The program displays the first four valid elements from the Layout class. It shows the result of an invalid access.
ConsoleC# program that uses indexer with int
using System;
class Layout
{
string[] _values = new string[100]; // Backing store
public string this[int number]
{
get
{
// This is invoked when accessing Layout with the [ ].
if (number >= 0 && number < _values.Length)
{
// Bounds were in range, so return the stored value.
return _values[number];
}
// Return an error string.
return "Error";
}
set
{
// This is invoked when assigning to Layout with the [ ].
if (number >= 0 && number < _values.Length)
{
// Assign to this element slot in the internal array.
_values[number] = value;
}
}
}
}
class Program
{
static void Main()
{
// Create new instance and assign elements
// ... in the array through the indexer.
Layout layout = new Layout();
layout[1] = "Frank Gehry";
layout[3] = "I. M. Pei";
layout[10] = "Frank Lloyd Wright";
layout[11] = "Apollodorus";
layout[-1] = "Error";
layout[1000] = "Error";
// Read elements through the indexer.
string value1 = layout[1];
string value2 = layout[3];
string value3 = layout[10];
string value4 = layout[11];
string value5 = layout[50];
string value6 = layout[-1];
// Write the results.
Console.WriteLine(value1);
Console.WriteLine(value2);
Console.WriteLine(value3);
Console.WriteLine(value4);
Console.WriteLine(value5); // Is null
Console.WriteLine(value6);
}
}
Output
Frank Gehry
I. M. Pei
Frank Lloyd Wright
Apollodorus
(null)
Error
Tip: The .NET Framework implements properties in the same way as methods but with an additional table to provide more information.
ILIntermediate language for example indexer: IL
.property instance string Item
{
.get instance string Layout::get_Item(int32)
.set instance void Layout::set_Item(int32, string)
}
Class: The Implementation class then declares an indexer with the same parameters. You can use the indexer through the interface type.
Here: The IPerl type is an interface. The Implementation type implements IPerl and provides data for the indexer accessors.
Info: In a real program, the set and get accessors might provide more detailed logic for preventing or reporting failures.
C# program that implements indexer on interface
using System;
interface IPerl
{
int this[int number] { get; set; }
}
class Implementation : IPerl
{
int[] _data = { 0, 10, 20, 30 }; // Default values
public int this[int number]
{
get
{
// Get accessor implementation.
return this._data[number];
}
set
{
// Set accessor implementation.
this._data[number] = value;
}
}
}
class Program
{
static void Main()
{
// Create an object instance.
// ... Use the indexer through the interface type.
IPerl perl = new Implementation();
Console.WriteLine(perl[0]);
Console.WriteLine(perl[1]);
Console.WriteLine(perl[2]);
Console.WriteLine(perl[3]);
// Use set accessor.
perl[0] = -1;
Console.WriteLine(perl[0]);
}
}
Output
0
10
20
30
-1
Farm: We create a "Farm" class. This class stores a string array of animals (strings) as a field.
Indexer: The this-property is an indexer. In the Farm initializer, we create entries at indexes 1, 3 and 5 for animal names.
C# program that uses indexer initializer
using static System.Console;
class Farm
{
string[] _animals = new string[10];
public string this[int number]
{
get
{
return _animals[number];
}
set
{
_animals[number] = value;
}
}
}
class Program
{
static void Main()
{
// ... Use an index initializer.
Farm f = new Farm() {[1] = "cat",[3] = "bird",[5] = "dog" };
// Get values from farm by index.
WriteLine(f[1]);
WriteLine(f[3]);
WriteLine(f[5]);
}
}
Output
cat
bird
dog
Get: Please look at the "Apartment" indexer. The "get" keyword has an expression body to its right.
Set: The "set" method also uses an expression body. No parentheses are used. The special "value" keyword is used.
C# program that uses expression-bodied indexer
using static System.Console;
class Apartment
{
string[] _furniture = new string[10];
public string this[int number]
{
get => _furniture[number]; // Expression-bodied indexer.
set => _furniture[number] = value;
}
}
class Program
{
static void Main()
{
var apt = new Apartment() { [0] = "chair", [1] = "bed", [2] = "desk" };
// Use indexer.
WriteLine(apt[0]);
WriteLine(apt[1]);
WriteLine(apt[2]);
}
}
Output
chair
bed
desk
But: Ref and out parameters are not allowed. You will need a custom method to use these parameter modifiers.
RefOutDictionary: This includes the Dictionary collection, which allows you to look up elements with the indexer.
DictionaryHashtableArrayList: Also, ArrayList and List use indexers to simulate the built-in syntax of arrays in the C# language.
ListArrayList