Indexer ermöglichen die Indizierung von Instanzen von Klassen oder Strukturen genau wie ein Array. Wenn Sie einen Indexer für eine Klasse definieren, verhält sich die Klasse wie ein Array. Sie können hierfür den Array-Accessor „[]“ verwenden Der Zugriff auf die Klasse ähnelt dem Attribut, aber der Indexer akzeptiert Parameter (Man kann auch davon ausgehen, dass der Indexer ein Attribut einer Klasse ist, das auch über einen Accessor (eine spezielle Methode) implementiert wird)
Um es klarer zu machen, geben wir ein Beispiel: Studenten können viele Dinge tun, die sie einmal tun wollten, aber aus verschiedenen Gründen nicht tun. 1. Um das Verhalten des Unterrichtsschwänzens zu verhindern, ruft der Lehrer jedes Mal im Unterricht den Namen oder die Schülernummer an, in der ich mich in der 4. Klasse befinde. Der Lehrer ruft gerne die Schülernummer „Klasse 4 Nr. 1“ an. und antworte dann laut „An…“, „Klasse 4, Nr. 2“, „Klasse 4, Nr. 3“... „Nr. 3. Klassenkamerad.“, „Lehrer HC666 hat Bauchschmerzen und ging zu.“ heute ins Krankenhaus.“ (Guten Morgen, China. Mitbewohner ^_^), „Oh, Nr. 4“... Der Appell des Lehrers ist ein Index für Klasse 4.
Wenn Klasse4 als ein von der Klassenklasse instanziiertes Objekt betrachtet wird, ist Klasse[1] der Index von Klassenkamerad Nr. 1 (denken Sie an das Array und Sie werden es verstehen), wie implementiert man es dann?
Definieren Sie den Indexer:
Wie oben erwähnt, sind die Get- und Set-Accessoren natürlich auch ein Mitglied der Klasse Es muss wie folgt in der Klasse definiert sein:
public 返回值类型 this[参数类型 参数] { get { return 参数指定的值; } //get访问器 set { /*设置参数指定的值 */ } //set访问器 }
Instanz des Indexers:
Wir werden das obige Beispiel wie folgt codieren:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test1 {//定义一个能被索引的类 class Classes {//对类的索引实质是对类中数组的索引 public string[] StudentName=new string[6]; //定义索引器 public string this[int ID] { get { return StudentName[ID]; } set { StudentName[ID] = value; } //set访问器自带value参数 } } class Program { static void Main(string[] args) { Classes class4 = new Classes(); //索引写入 for (int i = 1; i < 6; i++) { class4[i] = "HC"+i; } //索引读出 for (int j = 1; j < 6; j++) { Console.WriteLine(j+"号\t"+class4[j]); } } } }
Ergebnis:
Indexer neu laden:
Im obigen Programm haben wir den Namen des Studenten über die Studentennummer indiziert, also wie man es namentlich erreicht Wie wäre es mit der Indexierung der Matrikelnummer? Wir betrachten den Index als eine spezielle Methode. Die Methode kann Überladung verwenden, um dieselbe Funktion mit unterschiedlichen Parametern zu erreichen, sodass der Indexer natürlich überlastet werden kann. Die Verwendung ähnelt der Methodenüberladung (klicken Sie hier, um die Methodenüberladung anzuzeigen). Dieses Mal müssen wir den Namensindex verwenden, um die Studentennummer zu erhalten:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test1 {//定义一个能被索引的类 class Classes {//对类的索引实质是对类中数组的索引 public string[] StudentName=new string[6]; //定义索引器 public string this[int ID] { get { return StudentName[ID]; } set { StudentName[ID] = value; } //set访问器自带value参数 } //重载索引器参数设为string类型 public uint this[string name] { get { //找到与name匹配的学号 uint index=1; while (StudentName[index] != name && index < 6) { index++; } return index; } set { } } } class Program { static void Main(string[] args) { Classes class4 = new Classes(); //索引写入 for (int i = 1; i < 6; i++) { class4[i] = "HC"+i; } //索引读出,通过学号索引出姓名 for (int j = 1; j < 6; j++) { Console.WriteLine(j+"号\t"+class4[j]); } //通过姓名索引出学号 for (int k = 1; k < 6; k++) { string name="HC"+k; Console.WriteLine(name+"\t"+class4[name]+"号");//对比上面用法一样参数不一样 } } } }
Ergebnis:
Wir haben oben gesagt, dass, wenn eine Klasse einen Indexer definiert, die Klasse als Array behandelt werden kann. Wenn wir etwas über Arrays lernen, wissen wir, dass Arrays mehrere Dimensionen und Indexer haben Kategorie? ? Kann die foreach-Traversal-Anweisung, die wir zum Durchlaufen des Arrays verwenden, auch für diese Klasse verwendet werden? ? Ich werde es im nächsten Artikel vorstellen! ! (Weil die Schule einen Stromausfall haben wird ...) Ich hoffe, dass Sie HC666^_^ weiterhin unterstützen werden
Das Obige ist der Inhalt des C#-Lerntagebuchs 28 --- Indexer, überladener Indexer. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!