C# Generika
GenerikaErmöglichen es Ihnen, die Festlegung des Datentyps von Programmierelementen in einer Klasse oder Methode aufzuschieben, bis er tatsächlich im Programm verwendet wird. Mit anderen Worten: Generika ermöglichen es Ihnen, eine Klasse oder Methode zu schreiben, die mit jedem Datentyp funktioniert.
Sie können Spezifikationen für Klassen oder Methoden schreiben, indem Sie Ersatzparameter für Datentypen verwenden. Wenn der Compiler auf einen Klassenkonstruktor oder einen Methodenaufruf trifft, generiert er Code, um den angegebenen Datentyp zu behandeln. Das folgende einfache Beispiel hilft Ihnen, dieses Konzept zu verstehen:
Beispiel
using System.Collections.Generic;
namespace GenericApplication
{
public class MyGenericArray<T>
{
private T[] array;
public MyGenericArray(int size)
{
array = new T[size + 1];
}
public T getItem(int index)
{
return array[index];
}
public void setItem(int index, T value)
{
array[index] = value;
}
}
class Tester
{
static void Main(string[] args)
{
// Deklariere ein Integer-Array
MyGenericArray<int> intArray = new MyGenericArray<int>(5);
// Wert setzen
for (int c = 0; c < 5; c++)
{
intArray.setItem(c, c*5);
}
// Wert abrufen
for (int c = 0; c < 5; c++)
{
Console.Write(intArray.getItem(c) + " ");
}
Console.WriteLine();
// Ein Zeichenarray deklarieren
MyGenericArray<char> charArray = new MyGenericArray<char>(5);
// Wert setzen
for (int c = 0; c < 5; c++)
{
charArray.setItem(c, (char)(c+97));
}
// Wert abrufen
for (int c = 0; c < 5; c++)
{
Console.Write(charArray.getItem(c) + " ");
}
Console.WriteLine();
Console.ReadKey();
}
}
}
Wenn der obige Code kompiliert und ausgeführt wird, liefert er die folgenden Ergebnisse:
0 5 10 15 20 a b c d e
Merkmale von Generics
Die Verwendung von Generics ist eine Technik zur Verbesserung der Programmfunktionalität, insbesondere in den folgenden Aspekten:
- Es hilft Ihnen, die Wiederverwendung von Code zu maximieren, die Typsicherheit zu schützen und die Leistung zu verbessern.
- Sie können generische Auflistungsklassen erstellen. Die .NET Framework-Klassenbibliothek imSystem.Collections.Generic-Namespace enthält einige neue generische Auflistungsklassen. Sie können diese generischen Auflistungsklassen verwenden, umSystem.Collections zu ersetzenAuflistungsklassen in.
- Sie können eigene generische Schnittstellen, generische Klassen, generische Methoden, generische Ereignisse und generische Delegaten erstellen.
- Sie können generische Klassen so einschränken, dass sie auf Methoden bestimmter Datentypen zugreifen können.
- Informationen über die in generischen Datentypen verwendeten Typen können zur Laufzeit durch die Verwendung von Reflektion abgerufen werden.
Generische Methoden
Im obigen Beispiel haben wir generische Klassen verwendet. Wir können generische Methoden durch Typparameter deklarieren. Das folgende Programm veranschaulicht dieses Konzept:
Beispiel
using System.Collections.Generic;
namespace GenericMethodAppl
{
class Program
{
static void Swap<T>(ref T lhs, ref T rhs)
{
T temp;
temp = lhs;
lhs = rhs;
rhs = temp;
}
static void Main(string[] args)
{
int a, b;
char c, d;
a = 10;
b = 20;
c = 'I';
d = 'V';
// Werte vor dem Tauschen anzeigen
Console.WriteLine("Int-Werte vor dem Aufruf von swap:");
Console.WriteLine("a = {0}, b = {1}", a, b);
Console.WriteLine("Char-Werte vor dem Aufruf von swap:");
Console.WriteLine("c = {0}, d = {1}", c, d);
// swap aufrufen
Swap<int>(ref a, ref b);
Swap<char>(ref c, ref d);
// Werte nach dem Tauschen anzeigen
Console.WriteLine("Int-Werte nach dem Aufruf von swap:");
Console.WriteLine("a = {0}, b = {1}", a, b);
Console.WriteLine("Char-Werte nach dem Aufruf von swap:");
Console.WriteLine("c = {0}, d = {1}", c, d);
Console.ReadKey();
}
}
}
Wenn der obige Code kompiliert und ausgeführt wird, liefert er die folgenden Ergebnisse:
Int values before calling swap: a = 10, b = 20 Char values before calling swap: c = I, d = V Int values after calling swap: a = 20, b = 10 Char values after calling swap: c = V, d = I
Generische Delegaten
Sie können generische Delegaten mithilfe von Typparametern definieren. Zum Beispiel:
delegate T NumberChanger<T>(T n);
Das folgende Beispiel veranschaulicht die Verwendung von Delegaten:
Beispiel
using System.Collections.Generic;
delegate T NumberChanger<T>(T n);
namespace GenericDelegateAppl
{
class TestDelegate
{
static int num = 10;
public static int AddNum(int p)
{
num += p;
return num;
}
public static int MultNum(int q)
{
num *= q;
return num;
}
public static int getNum()
{
return num;
}
static void Main(string[] args)
{
// Eine Delegateninstanz erstellen
NumberChanger<int> nc1 = new NumberChanger<int>(AddNum);
NumberChanger<int> nc2 = new NumberChanger<int>(MultNum);
// Delegatobjekt verwenden, um Methode aufzurufen
nc1(25);
Console.WriteLine("Wert von Num: {0}", getNum());
nc2(5);
Console.WriteLine("Wert von Num: {0}", getNum());
Console.ReadKey();
}
}
}
Wenn der obige Code kompiliert und ausgeführt wird, liefert er die folgenden Ergebnisse:
Value of Num: 35 Value of Num: 175Weitere Erweiterungen