TheDeveloperBlog.com

Home | Contact Us

C-Sharp | Java | Python | Swift | GO | WPF | Ruby | Scala | F# | JavaScript | SQL | PHP | Angular | HTML

<< Back to C-SHARP

C# Indexer Examples (This Keyword, get and set)

Use indexers with classes and interfaces. Indexers provide an array-like syntax.
Indexer. An indexer provides array-like syntax. It allows a type to be accessed the same way as an array. Properties such as indexers often access a backing store.PropertyThis
Indexer details. In an indexer, we often accept an int parameter and access a backing array. We can initialize values in an indexer with an initializer.
An example. This program contains a class that has an indexer member, which itself contains a get accessor and a set accessor. These accessors are implicitly used.

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.

Array

WriteLine: The program displays the first four valid elements from the Layout class. It shows the result of an invalid access.

Console
C# 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
Intermediate language. A separate metadata table exists that stores the get_Item and set_Item methods, which implement the logic for the get and set accessors in the indexer.

Tip: The .NET Framework implements properties in the same way as methods but with an additional table to provide more information.

IL
Intermediate language for example indexer: IL .property instance string Item { .get instance string Layout::get_Item(int32) .set instance void Layout::set_Item(int32, string) }
Interface indexer. This program uses an indexer member on an interface type. The interface declares the indexer and leaves the get and set accessors empty.

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
Initializer. An indexer can be initialized just like other properties. We specify the square brackets around the index and assign it to a value. The syntax is unusual at first glance.

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
Expression-bodied indexer. This example uses an indexer with the "expression-bodied" syntax. This is more like a lambda expression.

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
Parameters. The parameter list varies depending on your requirements. In a collection that maps string keys to values, you will want to have an indexer that accepts a string.
2D collections. To simulate a 2D collection, you can use two parameters in the indexer. Because indexers are regular methods in the implementation, there are few limitations.

But: Ref and out parameters are not allowed. You will need a custom method to use these parameter modifiers.

RefOut
Framework. Indexers have been used throughout the .NET Framework in Microsoft's own code since the Framework was released. Many collections use indexers.

Dictionary: This includes the Dictionary collection, which allows you to look up elements with the indexer.

DictionaryHashtable

ArrayList: Also, ArrayList and List use indexers to simulate the built-in syntax of arrays in the C# language.

ListArrayList
A summary. An indexer is a property accessor type. Indexers have more complex syntax than other properties. They provide array-like accesses on the class instance.Class
© TheDeveloperBlog.com
The Dev Codes

Related Links:


Related Links

Adjectives Ado Ai Android Angular Antonyms Apache Articles Asp Autocad Automata Aws Azure Basic Binary Bitcoin Blockchain C Cassandra Change Coa Computer Control Cpp Create Creating C-Sharp Cyber Daa Data Dbms Deletion Devops Difference Discrete Es6 Ethical Examples Features Firebase Flutter Fs Git Go Hbase History Hive Hiveql How Html Idioms Insertion Installing Ios Java Joomla Js Kafka Kali Laravel Logical Machine Matlab Matrix Mongodb Mysql One Opencv Oracle Ordering Os Pandas Php Pig Pl Postgresql Powershell Prepositions Program Python React Ruby Scala Selecting Selenium Sentence Seo Sharepoint Software Spellings Spotting Spring Sql Sqlite Sqoop Svn Swift Synonyms Talend Testng Types Uml Unity Vbnet Verbal Webdriver What Wpf