So arbeiten Sie mit Generika in C #

C # ist eine stark typisierte Sprache. Dies bedeutet, dass Sie bei Verwendung von C # einen Typ deklarieren sollten, bevor Sie Daten darin speichern. Obwohl diese Typensicherheit dazu beiträgt, die Sicherheit und Interoperabilität zwischen Sprachen zu gewährleisten, die auf die verwaltete Umgebung abzielen, müssen Sie als Entwickler nur den Typ eines Objekts definieren, mit dem Sie arbeiten müssen.

OK, aber was ist, wenn Sie Daten in einer typsicheren Sammlung ohne Overhead beim Ein- und Auspacken speichern möchten? Hier kommen Generika zur Rettung.

Mit Generika können Sie mit typsicheren Daten ohne Overhead beim Ein- und Auspacken arbeiten. Sie können Generika nutzen, um typsichere Sammlungen sowie Klassen und Methoden zu erstellen, die einen Typ als Parameter akzeptieren können. Einmal deklarierte Klassen können mit jedem Typ arbeiten. Dies hilft Ihrem Code, viel besser zu verwalten, zu erweitern, zu warten und effizienter zu sein. In diesem Artikel untersuchen wir Generika und wie sie mit der Programmiersprache C # implementiert werden können.

Generika helfen Ihnen bei der Implementierung von Algorithmen, die für eine Vielzahl von Typen geeignet sind. Als Beispiel möchten Sie möglicherweise einen Algorithmus schreiben, um ein Array von Ganzzahlen oder Doppelwerten oder sogar ein Array von Zeichenfolgen zu sortieren. Um solche Sortieralgorithmen ohne Generika zu implementieren, benötigen Sie normalerweise mehrere Sortiermethoden - eine pro Typ.

Nachdem Sie eine Klasse oder Methode mithilfe von Typparametern deklariert haben, können Sie die Angabe des Typs verschieben, mit dem die Klassen oder Methoden arbeiten würden, bis auf diese Klassen und Methoden über den Clientcode zugegriffen wird. Generika fördern die Typensicherheit, die Codepflege, die Codeeffizienz und die Leistung. Beachten Sie, dass Sie Generika nutzen können, um Ihre eigenen generischen Klassen, Schnittstellen, Methoden, Ereignisse und Delegaten zu implementieren.

Wenn Sie Generika verwenden, müssen Sie die Objekte nicht mehr in die entsprechenden Typen umwandeln - die Typinformationen sind in Ihrem Code gut dokumentiert. Wenn Sie Generika verwenden, überprüft der Compiler die Kompilierungszeit Ihres Codes auf Übereinstimmung mit der Typensicherheit. Code, der Generika verwendet, ist immer auf die Vermeidung von Overheads beim Ein- und Auspacken zurückzuführen.

Die folgende Codeliste zeigt drei Methoden zum Sortieren der Eingabedaten - Sie benötigen eine Sortiermethode für jeden Typ.

public static int[] Sort(int[] integerArray)

  {

      //Code to sort an array of integers

      return integerArray;

  }

public static string[] Sort(string[] stringArray)

  {

      //Code to sort an array of strings

      return stringArray;

  }

public double[] Sort(double[] doubleArray)

  {

      //Code to sort an array of doubles

      return doubleArray;

  }

Wenn Sie Generics verwenden, können Sie nur eine Methode verwenden, die einen Typparameter akzeptiert und die Eingabedaten sortiert, wenn Sie dazu aufgefordert werden.

public class Algorithm

    {

        public static T[] Sort(T[] inputArray)

        {

            //Code to sort a generic array

            return inputArray;

        }

    }

Geben Sie Parametereinschränkungen ein

Wenn Sie mit Generika arbeiten, sollten Sie die allgemeinen Einschränkungen kennen, die Folgendes umfassen: Ableitungsbeschränkungen und Standardkonstruktorbeschränkungen. Die Ableitungsbeschränkungen werden verwendet, um die Schnittstelle oder Klasse anzugeben, die zum Definieren der Ableitung für den generischen Typ verwendet werden soll.

Hier ist ein Beispiel, das zeigt, wie der interface ILoggerverwendet wurde, um den Typparameter T (beim Definieren der DBLoggerKlasse) auf die ILoggerTypschnittstelle zu beschränken.

public interface ILogger

    {

        //Some code

    }

    public class DBLogger where T : ILogger

    {

        //Some code

    }

Ihre generischen Typparameter können entweder Wert- oder Referenztypen sein. Als Beispiel können Sie Ihre Klasse, die einen generischen Typparameter enthält, auf eine der folgenden Arten definieren.

public class FileLogger where T : class

    {

        //Some code

    }

 public class BaseLogger where T: int

    {

        //Some code

    }

Die Konstruktoreinschränkung wird verwendet, um einen Standardkonstruktor für den generischen Typparameter zu erzwingen. Hier ist ein Beispiel, um dieses Konzept zu veranschaulichen.

class DBLogger where T : new() // The generic type parameter T must have a default constructor

{

   //Some code

}

Sie können auch generische Typparameter verwenden, wenn Sie mit Vererbung arbeiten. Hier ist ein Beispiel, das zeigt, wie Sie dies erreichen können. Beachten Sie, dass der generische Typparameter im folgenden Beispiel einen Standardkonstruktor haben sollte.

public class BaseLogger

    {

        //Some code

    }

    public class FileLogger : BaseLogger where T : new()

    {

        //Some code

    }

Die folgende Codeliste zeigt, wie generische Methoden implementiert werden können.

public class BaseLogger

    {

        public void Initialize(T t)

        {

          //Code to initialize logger

        }

    }

Siehe das oben angegebene Code-Snippet. Beachten Sie, wie der generische Typparameter in der Initialize()Methode als Parameter verwendet wurde. Ich würde in meinen zukünftigen Beiträgen hier mehr über Generika diskutieren. Weitere Informationen zu Generika finden Sie hier: //msdn.microsoft.com/en-us/library/512aeb7t.aspx