2009-11-19 5 views
7

Ich verstehe Indexer ermöglichen es uns, innerhalb einer Klasse eine Sammlung zuzugreifen, als ob die Klasse selbst ein Array waren.C# - Indexer an seiner sinnvollen Anwendung

Angenommen, wir entwickeln ein Projekt, wo passen wir die tatsächliche praktische Verwendung solcher Indexer (Beispiel kann helfen)?

Antwort

8

Betrachten Sie fast alle Auflistungsklassen im Framework als Beispiel. Wenn ich ohne Indexer ein Element aus einer Hash-Tabelle in einer Sprache abzurufen, würde ich verwenden Syntax wie:

object o = table.getvalue(key); 

wo ein Indexer ermöglicht etwas einfachere Syntax:

object o = table[key]; 

(absichtlich ignoriert die Eingabe/Generika Probleme in den Proben oben)

5

Sie haben mehrere Beispiele in den generischen Sammlungen des Frameworks. Wörterbuch ist ein ziemlich gutes Beispiel:

Dictionary<string, User> Users; 

Users["Jorge"].ResetPassword(); 

, die viel eleganter und einfacher wäre als

Users.GetElementByKey("Jorge").ResetPassword(); 
1

Nun, die offensichtliche Anwendung für Indexer verwenden, sind ... (Überraschung) Kollektionen.

wie:

  • Listen:

    list[4] 
    
  • Hash-Tabellen:

    table["foo"] 
    table[Color.Black] 
    

Denken Sie daran, dass Indexer nicht Argumente auf ganzzahlige beschränkt.

2

Angenommen, Sie entwickeln Microsoft .NET Framework für andere Entwickler zu verwenden (was ist wirklich ein "real-world-Projekt"). Sie müssen eine Klasse schreiben, die wie ein Array funktioniert, aber die Größenänderung dynamisch unterstützt (die Klasse List<T>). Ohne einen Indexer, könnte man zwei Methoden schreiben zu bekommen und setzen Elemente:

public T get(int index) { ... } 
public void set(int index, T value) { ... } 
// (Java advocates: no offense intended) 

Angenommen, ein Benutzer Ihrer Bibliothek will das zweite Element erhöhen. Sie wird schreiben müssen:

list.set(1, list.get(1) + 1); 

Mit einem Indexer ist die Syntax viel einfacher, lesbarer und leichter zu verstehen:

list[1]++; 

(ähnliche Argumente gelten für Dinge wie Dictionary<TKey,TValue> ...)

0

Wenn die Sammlung sortiert ist, können die ersten und letzten Elemente nützlich sein, um ein minimales oder maximales Element zu erhalten.

In ASP.Net gibt es mehrere Objekte, die Indexer wie Anwendung, Sitzung und Anforderung verwenden.

3

Indexer ermöglicht es uns, eine Sammlung innerhalb einer Klasse zuzugreifen, als ob die Klasse selbst ein Array waren.

Während das wahr ist, können Sie eine Klasse schreiben, dass nicht eine permanente Sammlung von Gegenständen in sich haben, aber noch in der Lage sein, dynamisch Sie mit einem berechneten Wert zu liefern, wenn indiziert. Die Daten können in Echtzeit aus dem Internet oder jeder anderen Datenquelle gesammelt werden - ich stelle mir beispielsweise eine Klasse SearchResults vor, mit der ich Google-Suchergebnisse für eine Zeichenfolge wie diese erhalten könnte: Console.out.WriteLine(SearchResults["Stackoverflow"].count). Es sammelt die Daten nur, wenn ich danach frage und eine Sammlung der abgerufenen Elemente zurückgeben.