Strukturen

Dieses Lernprogramm umfasst zwei Beispiele. Im ersten Beispiel wird erläutert, wie Sie Strukturen deklarieren und verwenden, und das zweite Beispiel veranschaulicht die Unterschiede, die zwischen Strukturen und Klassen erkennbar sind, wenn Instanzen an Methoden übergeben werden. Zusätzlich erhalten Sie eine Einführung in die folgenden Themen:

Beispiel 1

In diesem Beispiel wird eine Struktur mit drei Membern deklariert: einer Eigenschaft, einer Methode und einem privaten Feld. Es wird eine Instanz der Struktur erstellt und anschließend verwendet:

// struct1.cs
using System;
struct SimpleStruct
{
    private int xval;
    public int X
    {
        get{  return xval;}
        set{  if (value < 100) xval = value;}
    }
    public void DisplayX()
    {
        Console.WriteLine("The stored value is: {0}", xval);
    }
}

class TestClass
{
    public static void Main()
    {
        SimpleStruct ss = new SimpleStruct();
        ss.X = 5;
        ss.DisplayX();
    }
}

Ausgabe

The stored value is: 5

Strukturen oder Klassen?

Obwohl Strukturen und Klassen auf den ersten Blick ähnlich erscheinen, dürfen einige entscheidende Unterschiede nicht übersehen werden. Zunächst sind Klassen Verweistypen, und Strukturen sind Werttypen. Durch die Verwendung von Strukturen können Sie Objekte erstellen, die sich wie integrierte Typen verhalten und auch deren Vorteile nutzen.

Heap oder Stapel?

Beim Aufruf des New-Operators für eine Klasse wird dieser dem Heap zugeordnet. Wenn Sie eine Struktur instanziieren, wird sie jedoch auf dem Stapel erstellt. Dies bewirkt eine Leistungssteigerung. Darüber hinaus sind auch keine Verweise auf die Instanz einer Struktur erforderlich, wie dies bei Klassen der Fall ist. Sie arbeiten direkt mit der Strukturinstanz. Aus diesem Grund erfolgt die Übergabe einer Struktur an eine Methode anhand des Wertes und nicht anhand eines Verweises.

Beispiel 2

Dieses Beispiel verdeutlicht Folgendes: Wenn eine Struktur an eine Methode übergeben wird, wird eine Kopie der Struktur übergeben. Wird jedoch eine Klasseninstanz übergeben, geschieht dies anhand eines Verweises.

// struct2.cs
using System;

class TheClass
{
    public int x;
}

struct TheStruct
{
    public int x;
}

class TestClass
{
    public static void structtaker(TheStruct s)
    {
        s.x = 5;
    }
   
    public static void classtaker(TheClass c)
    // c ist eine REFERENZ (die Adresse einer Variablen)
    {
        c.x = 5; //auf der Adresse wird was abgelegt!
    }
    public static void Main()
    {
        TheStruct a = new TheStruct();
        TheClass b = new TheClass();
        a.x = 1;
        b.x = 1;
        structtaker(a);
        classtaker(b);
        Console.WriteLine("a.x = {0}", a.x);
        Console.WriteLine("b.x = {0}", b.x);
    }
}

Ausgabe

a.x = 1
b.x = 5

Codeerläuterung

An der Ausgabe des Beispiels ist erkennbar, dass bei der Übergabe der Klasseninstanz an die classtaker-Methode lediglich der Wert des class-Feldes geändert wurde. Das struct-Feld ist bei der Übergabe der Instanz an die structtaker-Methode jedoch unverändert geblieben. Dies liegt daran, dass lediglich eine Kopie der Struktur an die structtaker-Methode übergeben wurde, während an die classtaker-Methode ein Verweis auf die Klasse übergeben wurde.

Konstruktoren und Vererbung

Strukturen können Konstruktoren deklarieren, sie müssen jedoch Parameter aufnehmen. Die Deklaration eines (parameterlosen) Standardkonstruktors für eine Struktur verursacht einen Fehler, und Strukturmember können nicht über Initialisierungen verfügen. da stets ein Standardkonstruktor bereitgestellt wird, um die Strukturmember mit ihren Standardwerten zu initialisieren.

Wenn Sie ein Strukturobjekt mit dem New-Operator erzeugen, wird das Objekt erstellt und der geeignete Konstruktor aufgerufen. Strukturen können im Gegensatz zu Klassen ohne den New-Operator instanziiert werden. Wird New nicht verwendet, werden die Felder nicht zugewiesen, und das Objekt kann erst verwendet werden, nachdem alle Felder initialisiert wurden.

Bei Strukturen findet keine Vererbung wie bei Klassen statt. Eine Struktur ist nicht in der Lage, von einer anderen Struktur oder Klasse zu erben, und sie kann auch nicht die Basis einer Klasse sein. Strukturen erben jedoch vom Basisklassenobjekt. Eine Struktur kann Schnittstellen implementieren und verhält sich dabei genauso wie eine Klasse. Im Folgenden sehen Sie einen Codeausschnitt einer Struktur, durch die eine Schnittstelle implementiert wird:

interface IImage
{
    void Paint();
}

struct Picture : IImage
{
    public void Paint()
    {
         // painting code goes here
    }
    private int x, y, z;  // other struct members
}

Schlussfolgerung

Strukturen sind einfach zu verwenden und können sich zeitweise als hilfreich erweisen. Sie sollten jedoch bedenken, dass Strukturen auf dem Stapel erstellt werden und nicht mit Hilfe von Verweisen, sondern direkt angesprochen werden. Strukturen sind besonders geeignet, wenn Sie einen Typ benötigen, der häufig verwendet wird und in den meisten Fällen ein einfaches Datenelement darstellt.



Quelle http://msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/csref/html/vcoricsharptutorials.asp



Aufgabenstellung: