-
Sammlung des Implementierungsprozesses des Indexers in C#
Einer der interessantesten Aspekte der C#-Sprache ist der Klassenindexer. Vereinfacht ausgedrückt handelt es sich bei dem sogenannten Indexer um einen speziellen Attributtyp, über den Sie Ihre eigene Klasse wie ein Array referenzieren können. Offensichtlich ist diese Funktion besonders nützlich beim Erstellen von Sammlungsklassen, aber in anderen Situationen, beispielsweise bei der Verarbeitung großer Dateien oder der Abstraktion bestimmter begrenzter Ressourcen, ist es natürlich auch sehr nützlich, in einer Klasse ein Array-ähnliches Verhalten zu haben. Dieser Artikel führt Sie durch die Einrichtung einer Klasse für die Verwendung eines Indexers. Aber lassen Sie uns zunächst das Konzept der Eigenschaften skizzieren, um einige notwendige Hintergrundinformationen zu liefern.
Eigenschaften Wenn Sie jemals ein Programm in VB6 geschrieben haben, sollten Sie mit Eigenschaftsmethoden bestens vertraut sein. Die sogenannten Eigenschaftsmethoden sind eigentlich spezielle Klassenmitglieder, die einen kontrollierten Zugriff auf private Klassenfelder implementieren. In der C#-Sprache gibt es zwei Attributmethoden: Eine ist get, mit der der Wert des privaten Felds zurückgegeben werden kann, und die zweite ist set, mit der der Wert des privaten Felds festgelegt werden kann. Am Beispiel des folgenden Codes wird beispielsweise eine FirstName-Eigenschaft erstellt, um den Zugriff auf das private Klassenmitglied firstname zu steuern:
Klasse Person {
privater String Vorname;
öffentliche Zeichenfolge Vorname {
Holen Sie sich {Vorname zurückgeben;}
setze {Vorname = Wert;}
}
}
Eigenschaftsdeklarationen können wie folgt kodiert werden:
Person p = neue Person();
p.FirstName = "Lamont";
Console.WriteLine (p.FirstName);
Wie Sie sehen, ähnelt die Attributdeklaration eher einer Domänendeklaration, außer dass sie auch zwei spezielle Mitglieder deklariert, bei denen es sich laut Microsoft um sogenannte Accessoren handelt. Die Funktion „Get Access“ wird aufgerufen, wenn eine Eigenschaft auf der rechten Seite eines Ausdrucks aufgerufen wird oder wenn die Eigenschaft als Parameter einer anderen Unterroutine (oder Funktion) verwendet wird. Umgekehrt wird die Set-Zugriffsfunktion aufgerufen, wenn die Eigenschaft auf der linken Seite des Ausdrucks aufgerufen wird und der private Feldwert durch implizite Übergabe des Wertparameters festgelegt wird. Sie können schreibgeschützte Eigenschaften erstellen, indem Sie die Set-Accessor-Funktion weglassen, sodass jeder Versuch, die Eigenschaft festzulegen, einen Kompilierungsfehler generiert.
Vorteile der Verwendung von Indexern
Unten ist seine Struktur
<Modifikator> <Rückgabetyp> diese [Argumentliste]
...{
erhalten
...{
// Codes abrufen geht hier
}
Satz
...{
// Codes festlegen geht hierher
}
}
Notiz:
Modifikator: Modifikator, z. B. privat, öffentlich, geschützt oder intern
this: Dies ist ein spezielles Schlüsselwort in C#, das die aktuelle Instanz der Referenzklasse darstellt. Hier ist der Index der aktuellen Klasse gemeint.
Argumentliste: Dies bezieht sich auf die Parameter des Indexers.
Nachdem wir lange geredet haben, wenden wir uns dem Thema zu. Warum muss ich mich also in diesem Kreis bewegen? Tatsächlich liegt dies daran, dass der Indexer einer Klasse einer Eigenschaft sehr ähnlich ist, und dies gilt auch aus Code-Sicht. Hier ist ein Beispiel für eine Klasse mit einem Indexer, der eine Zeichenfolge zurückgibt:
Klasse Beispiel {
öffentliche Zeichenfolge this [int index] {
get {return „Du hast bestanden“ + index }
}
}
Beachten Sie, dass der Attributname hier dieser ist, der auf die aktuelle Instanz der Klasse verweist, und die Parameterliste in eckigen Klammern statt in Klammern eingeschlossen ist. Außerdem ist dies ein schreibgeschützter Indexer. Um es in den Lese-/Schreibtyp zu ändern, habe ich eine Set-Zugriffsfunktion hinzugefügt. Beim Definieren eines Indexers benötigen Sie nicht unbedingt nur einen Parameter. Indexerparameter können jeden Typ haben, int ist jedoch normalerweise der sinnvollste Typ. Es ist auch möglich, mehr als einen Indexer (überlastet) in derselben Klasse zu haben.
Nachdem wir die Sample-Klasse wie oben definiert haben, können wir den Indexer als Standardattribut verwenden, wie unten gezeigt:
Sample s = new Sample();
Console.WriteLine(s[55]);
Eigenschaften und Indexer Es gibt mehrere Unterschiede zwischen Eigenschaften und Indexern:
Jedes Attribut der Klasse muss einen eindeutigen Namen haben und jeder in der Klasse definierte Indexer muss eine eindeutige Signatur oder Parameterliste haben (damit eine Indexerüberladung implementiert werden kann).
Eigenschaften können statisch sein und Indexer müssen Instanzmitglieder sein.
Für Indexer definierte Zugriffsfunktionen haben Zugriff auf die an den Indexer übergebenen Parameter, während Eigenschaftenzugriffsfunktionen keine Parameter haben.
Das Array-ähnliche Verhalten von Schnittstellen wird häufig von Programmimplementierern bevorzugt, sodass Sie auch Indexer für die Schnittstelle definieren können. Sowohl die IList- als auch die IDictionary-Sammlungsschnittstelle deklarieren Indexer für den Zugriff auf ihre gespeicherten Elemente.
Bedenken Sie beim Deklarieren eines Indexers für eine Schnittstelle, dass die Deklaration nur die Existenz des Indexers angibt. Sie müssen nur die entsprechenden Zugriffsfunktionen bereitstellen, ohne Bereichsmodifikatoren einzubeziehen. Der folgende Code deklariert den Indexer als Teil der Schnittstelle IIimplementMe:
Schnittstelle IIimplementMe {
string this[int index]
{
erhalten;
Satz;
}
Die entsprechende implementierte Klasse muss speziell die Get- und Set-Zugriffsfunktionen für den Indexer von IimplementMe definieren.
Das ist ein grundlegender Überblick über Indexer. Sie sollten jetzt ein besseres Verständnis für die Rolle haben, die Indexer in Ihrer Entwicklung spielen.
Klasse SampleCollection<T>
{
privates T[] arr = neues T[100];
public T this[int i]
{
erhalten
{
return arr[i];
}
Satz
{
arr[i] = Wert;
}
}
}
// Diese Klasse zeigt, wie Clientcode den Indexer verwendet
Klassenprogramm
{
static void Main(string[] args)
{
SampleCollection<string> stringCollection = new SampleCollection<string>();
stringCollection[0] = "Hallo Welt";
System.Console.WriteLine(stringCollection[0]);
}
}
Dieser Artikel stammt aus dem CSDN-Blog. Bitte geben Sie beim Nachdruck die Quelle an: http://blog.csdn.net/licheng19891020/archive/2009/12/09/4974516.aspx
-