So arbeiten Sie mit Strukturen in C #

Während es viele Ähnlichkeiten zwischen einer Klasse und einer Struktur gibt, gibt es auch einige deutliche Unterschiede. Am wichtigsten ist, dass eine Struktur im Gegensatz zu einer Klasse ein Werttyp ist. Während also Instanzen einer Klasse im Heap gespeichert sind, werden Instanzen einer Struktur im Stapel gespeichert.

Wenn eine Instanz einer Struktur an eine Methode übergeben wird, wird sie immer als Wert übergeben. Dies steht im Gegensatz zu dem, was passiert, wenn wir eine Instanz einer Klasse an eine Methode übergeben - die Instanz wird als Referenz übergeben.

Programmieren von Strukturen in C #

So sieht die Syntax zum Deklarieren einer Struktur aus.

struct

{

//Data members and member functions of the struct

}

The following code snippet shows how a typical struct definition looks like.

struct Rectangle

    {

        public int width;

        public int height;

    }

Sie können jetzt den Mitgliedern der Struktur, die Sie zuvor definiert haben, Werte zuweisen, wie im folgenden Codeausschnitt gezeigt.

Rectangle rectangle = new Rectangle();

rectangle.width = 10;

rectangle.height = 15;

Das obige Code-Snippet erstellt eine Instanz der Rectangle-Struktur und weist den öffentlichen Mitgliedern Werte zu. Beachten Sie, dass Sie sowohl Elementdaten als auch Methoden in einer Struktur haben können. Sie können die Mitglieder auch als privat, öffentlich und intern angeben. Es sollte beachtet werden, dass Sie im Gegensatz zu Klassen keine Feldinitialisierer für nicht statische Felder in Strukturen haben können. Daher sind Anweisungen wie die folgenden in einer Struktur nicht gültig.

int width = 10;

int height = 15;

Sie können statische Elemente in Ihren Strukturen trotzdem initialisieren. Daher ist das Folgende eine gültige Anweisung innerhalb einer Struktur.

static int area = 0;

Fügen wir der Struktur nun einige Methoden hinzu. Hier ist die aktualisierte Version der zuvor erstellten Rechteckstruktur. Beachten Sie die Verwendung des parametrisierten Konstruktors.

struct Rectangle

    {

        int width;

        int height;

        public Rectangle(int width, int height)

        {

            this.width = width;

            this.height = height;

        }

        public int GetArea()

        {

            return this.width * this.height;

        }

    }

Beachten Sie, dass Sie auch dann Parameterparameter in einer Struktur haben können, wenn Sie in einer Struktur keinen expliziten parameterlosen Konstruktor definieren können. Ähnlich wie bei einer Klasse können Sie auch Konstruktoren in einer Struktur überladen haben. Hier erfahren Sie, wie Sie Werte mit dem Konstruktor der Rectangle-Struktur festlegen und dann den Bereich durch Aufrufen der GetArea () -Methode abrufen können. Es sollte beachtet werden, dass Sie ähnlich wie in einer Klasse statische und nicht statische Methoden in einer Struktur haben können.

static void Main(string[] args)

        {

            Rectangle rectangle = new Rectangle(10, 15);

            int area = rectangle.GetArea();

            Console.WriteLine("The area is: " + area.ToString());

            Console.Read();

        }

Wie eine Klasse bietet eine Struktur Unterstützung für Eigenschaften und Indexer. Ein wesentlicher Unterschied zwischen einer Struktur und einer Klasse besteht darin, dass eine Struktur im Gegensatz zu einer Klasse keine Vererbung unterstützt. Sie können keine Struktur haben, die eine andere Klasse oder Struktur erweitert. Ähnlich wie eine Klasse kann eine Struktur jedoch eine Schnittstelle implementieren. Hier ist ein Codebeispiel, das dies veranschaulicht.

 interface IRectangle

    {

        int GetArea();

    }

  struct Rectangle : IRectangle

    {

        int width;

        int height;

        public Rectangle(int width, int height)

        {

            this.width = width;

            this.height = height;

        }

        public int GetArea()

        {

            return this.width * this.height;

        }

    }

Auswahl zwischen einer Klasse und einer Struktur

Jetzt kommen wir zu einem interessanten Diskussionspunkt. Wann sollten wir eine Struktur über einer Klasse verwenden und umgekehrt?

Wie bereits in diesem Artikel erläutert, wird im Stapel eine Instanz einer Struktur erstellt, während im verwalteten Heap eine Instanz einer Klasse erstellt wird. Die Zuordnung und Freigabe von Werttypen ist billiger als Referenztypen. Eine Struktur ist eine gute Wahl, wenn Sie einen zusammengesetzten Datentyp erstellen müssen, der einige Datenelemente enthalten würde. Idealerweise sollte die Größe der Datenelemente einer Struktur weniger als 16 Byte betragen. Sie können sich für eine Struktur entscheiden, wenn Sie eine kleine zusammengesetzte Datenstruktur erstellen möchten, die eine Wertsemantik aufweist und nur wenige Datenelemente enthält. Wenn Sie in solchen Fällen struct verwenden, können Sie den mit der Speicherbereinigung verbundenen Overhead vermeiden.

Sie sollten die empfohlenen Best Practices befolgen, wenn Sie mit Strukturen arbeiten. Sie sollten vermeiden, eine Struktur zu verwenden, die größer ist als in diesem Artikel empfohlen. Beachten Sie außerdem, dass das Übergeben von Instanzen von Strukturen an Methoden in Bezug auf die Leistung teurer ist als das Übergeben von Instanzen von Klassen. Es wird empfohlen, Strukturen zu verwenden, wenn Sie mit kleinen Datenstrukturen arbeiten. Weitere Informationen zu diesem Thema finden Sie in diesem MSDN-Artikel.