So arbeiten Sie mit Indexern in C #

Die Programmiersprache C # unterstützt Indexer - eine Funktion, mit der Sie ein Objekt nur als Array verwenden können. Indexer werden auch als Smart Arrays bezeichnet und können ähnlich wie eine Eigenschaft definiert werden. In der MSDN heißt es: "Indexer ermöglichen die Indizierung von Instanzen einer Klasse oder Struktur wie Arrays. Indexer ähneln Eigenschaften, außer dass ihre Accessoren Parameter verwenden."

Obwohl Indexer und Eigenschaften in mehrfacher Hinsicht Ähnlichkeiten aufweisen, gibt es subtile Unterschiede zwischen ihnen. Im Gegensatz zu Eigenschaften können Sie mithilfe von Indizes auf einen Indexer zugreifen. Denken Sie daran, dass Sie mithilfe des Namens auf eine Eigenschaft zugreifen müssen. Außerdem sind Indexer Instanzmitglieder einer Klasse und können daher nicht statisch sein. Sie können sowohl statische als auch nicht statische Eigenschaften haben.

Das folgende Codefragment zeigt, wie ein Indexer deklariert wird:

this [argument list]

{

  get

  {

  }

  Set

  {

  }

}

Beachten Sie, dass der in der Syntaxdeklaration eines Indexers angegebene Modifikator privat, öffentlich, geschützt oder intern sein kann.

Betrachten Sie die folgende Klasse:

public class Contact

    {

        private string[] address = new string[3];

        public string this[int index]

        {

            get

            {

                return address[index];

            }

            set

            {

                address[index] = value;

            }

        }

    }

Die Contact-Klasse enthält ein privates Mitglied mit dem Namen address und definiert einen Indexer. Das Adresselement ist ein Array vom Typ string. So können Sie eine Instanz der Contact-Klasse erstellen und den Indexer verwenden.

Contact contact = new Contact();

 contact[0] = "Begumpet";

 contact[1] = "Hyderabad";

 contact[2] = "Telengana";

for (int i = 0; i < 3; i++)

Console.WriteLine (contact[i]);

Es ist zu beachten, dass Sie das Schlüsselwort "this" verwenden müssen, um Indexer zu definieren. Beachten Sie, dass Sie nicht nur Ganzzahlen als Indizes für den Zugriff auf Indexer verwenden müssen, sondern auch andere Suchmechanismen verwenden können. Ein Indexer wird normalerweise verwendet, wenn Ihre Klasse eine Sammlung oder Objekte darstellt. Sie können dann den Indexer verwenden, um mithilfe des Index auf ein bestimmtes Element zuzugreifen.

Versuchen wir ein Beispiel. Betrachten Sie die folgende Klasse mit dem Namen Kunde.

public class Customer

    {

       public List Orders

        {

            get; set;

        }

       public Order this[int orderID]

        {

            get

            {

                return (from o in Orders

                        where o.OrderID == orderID

                        select o).First();

            }

        }

    }

Die Customer-Klasse definiert einen Indexer vom Typ Order. Es enthält auch eine öffentliche Eigenschaft, die eine Liste vom Typ Order ist. Hier ist die Order-Klasse als Referenz.

public class Order

    {

        public int OrderID

        {

            get; set;

        }

    }

Das folgende Codeausschnitt zeigt, wie Sie auf den Indexer der Kundenklasse zugreifen können, um eine bestimmte Bestellung abzurufen.

   List lstOrder = new List();

  Order o1 = new Order();

  o1.OrderID = 1;

  Order o2 = new Order();

  o2.OrderID = 2;           

  lstOrder.Add(o1);

  lstOrder.Add(o2);

  Customer customer = new Customer();

  customer.Orders = lstOrder;

  Order o = customer[1];

Siehe den obigen Code-Ausschnitt. Beachten Sie, wie eine generische Liste vom Typ Order erstellt und der Orders-Eigenschaft einer Instanz der Customer-Klasse zugewiesen wurde. Als Nächstes übergeben Sie einfach die OrderId als Parameter, um die bestimmte Bestellinstanz abzurufen.

Indexer unterstützen die Vererbung, können polymorph und auch abstrakt sein. Betrachten Sie die folgende Klasse, die einen Indexer definiert, der virtuell ist. Die ContactBase-Klasse ist eine modifizierte Version der Contact-Klasse, die wir weiter oben in diesem Artikel beschrieben haben.

 public class ContactBase

    {

        protected string[] address = new string[3];

        public virtual string this[int index]

        {

            get

            {

                return address[index];

            }

            set

            {

                address[index] = value;

            }

        }

    }

Sie können jetzt eine Klasse aus der ContactBase-Klasse ableiten und den Indexer wie unten gezeigt überschreiben.

public class ConcreteContact: ContactBase

    {

       public override string this[int index]

        {

            get

            {

                return address[index];

            }

            set

            {

                address[index] = value;

            }

        }

    }

Im obigen Codebeispiel haben wir untersucht, wie Indexer beim Erben von Typen verwendet werden können und wie sie polymorphes Verhalten zeigen können.

Sie können einen Indexer genauso gut als abstrakt definieren. Dazu müssen Sie eine abstrakte Klasse erstellen und anschließend einen Indexer als abstrakt definieren. Lassen Sie uns die ContactBase-Klasse ändern und den Indexer als abstrakt definieren. So würde die geänderte Version der ContactBase-Klasse jetzt aussehen:

 public abstract class ContactBase

    {

        protected string[] address = new string[3];

        public abstract string this[int index]

        {

            get; set;

        }

}

Sie müssen die ConcreteContact-Klasse sowieso nicht ändern. Sie können jetzt den Indexer nutzen, um einer Instanz der ConcreteContact-Klasse Zeichenfolgenwerte zuzuweisen, wie unten gezeigt.

ConcreteContact contact = new ConcreteContact();

contact[0] = "Begumpet";

contact[1] = "Hyderabad";

contact[2] = "Telengana";