Instanzkonstruktoren (C#-Programmierhandbuch)

Wenn Sie mit dem Ausdruck new ein Objekt einer Klasse erstellen, werden alle Instanzmembervariablen mit Instanzkonstruktoren erstellt und initialisiert. Um eine statische Klasse oder statische Variablen in einer nicht statischen Klasse zu initialisieren, müssen Sie einen statischen Konstruktor definieren. Weitere Informationen finden Sie unter Statische Konstruktoren (C#-Programmierhandbuch).

Im folgenden Beispiel wird ein Instanzenkonstruktor dargestellt:

class CoOrds
{
    public int x, y;

    // constructor
    public CoOrds()
    {
        x = 0;
        y = 0;
    }
}

Tipp

Der Übersichtlichkeit halber enthält diese Klasse öffentliche Felder. Die Verwendung von öffentlichen Feldern zum Programmieren wird nicht empfohlen, da auf diese Weise jeder Methode an einer beliebigen Stelle im Programm uneingeschränkter und ungeprüfter Zugriff auf die interne Funktionsweise eines Objekts eingeräumt wird. Im Allgemeinen sollten Datenmember privat sein, und der Zugriff auf sie sollte ausschließlich über Klassenmethoden und Eigenschaften erfolgen.

Dieser Instanzenkonstruktor wird jedes Mal aufgerufen, wenn ein auf der CoOrds-Klasse basierendes Objekt erstellt wird. Ein Konstruktor wie dieser, der keine Argumente annimmt, wird Standardkonstruktor genannt. Häufig erweist es sich jedoch als nützlich, zusätzliche Konstruktoren bereitzustellen. Sie können beispielsweise der CoOrds-Klasse einen Konstruktor hinzufügen, um die Anfangswerte für die Datenmember anzugeben:

// tcA constructor with two arguments:
public CoOrds(int x, int y)
{
    this.x = x;
    this.y = y;
}

Auf diese Weise können CoOrd-Objekte mit Standardwerten oder mit bestimmten Anfangswerten erstellt werden:

CoOrds p1 = new CoOrds();
CoOrds p2 = new CoOrds(5, 3);

Bei Klassen ohne Konstruktor wird automatisch ein Standardkonstruktor generiert, und die Objektfelder werden mit Standardwerten initialisiert. Ein int wird z. B. mit 0 initialisiert. Weitere Informationen zu Standardwerten finden Sie unter Tabelle für Standardwerte (C#-Referenz). Da der Standardkonstruktor der CoOrds-Klasse alle Datenmember auf 0 (null) initialisiert, kann er einfach entfernt werden, ohne dass sich dies auf die Funktionsweise der Klasse auswirkt. Ein vollständiges Beispiel mit mehreren Konstruktoren bietet Beispiel 1 weiter unten in diesem Thema, und in Beispiel 2 wird ein automatisch generierter Konstruktor dargestellt.

Mithilfe von Instanzkonstruktoren können Sie auch die Instanzkonstruktoren von Basisklassen aufrufen. Der Klassenkonstruktor kann den Konstruktor der Basisklasse wie folgt über die Initialisierung aufrufen:

class Circle : Shape
{
    public Circle(double radius)
        : base(radius, 0)
    {
    }
}

In diesem Beispiel übergibt die Circle-Klasse Werte für den Radius und die Höhe an den Konstruktor, der von Shape bereitgestellt wird, wovon Circle abgeleitet wird. Beispiel 3 in diesem Thema liefert ein vollständiges Beispiel mit Shape und Circle.

Beispiel 1

Das folgende Beispiel stellt eine Klasse mit zwei Klassenkonstruktoren dar (einer ohne Argument und ein weiterer mit zwei Argumenten).

class CoOrds
{
    public int x, y;

    // Default constructor:
    public CoOrds()
    {
        x = 0;
        y = 0;
    }

    // tcA constructor with two arguments:
    public CoOrds(int x, int y)
    {
        this.x = x;
        this.y = y;
    }

    // Override the ToString method:
    public override string ToString()
    {
        return (String.Format("({0},{1})", x, y));
    }
}

class MainClass
{
    static void Main()
    {
        CoOrds p1 = new CoOrds();
        CoOrds p2 = new CoOrds(5, 3);

        // Display the results using the overriden ToString method:
        Console.WriteLine("CoOrds #1 at {0}", p1);
        Console.WriteLine("CoOrds #2 at {0}", p2);
        Console.ReadKey();
    }
}
/* Output:
 CoOrds #1 at (0,0)
 CoOrds #2 at (5,3)        
*/

Beispiel 2

In diesem Beispiel besitzt die Person-Klasse keinen Konstruktor, d. h, ein Standardkonstruktor wird automatisch bereitgestellt, und die Felder werden auf ihre Standardwerte initialisiert.

public class Person
{
    public int age;
    public string name;
}

class TestPerson
{
    static void Main()
    {
        Person person = new Person();

        Console.WriteLine("Name: {0}, Age: {1}", person.name, person.age);
        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
// Output:  Name: , Age: 0

Beachten Sie, dass age den Standardwert 0 und name den Standardwert null besitzt. Weitere Informationen zu Standardwerten finden Sie unter Tabelle für Standardwerte (C#-Referenz).

Beispiel 3

Das folgende Beispiel veranschaulicht die Verwendung der Basisklasseninitialisierung. Die Circle-Klasse wird von der allgemeinen Shape-Klasse abgeleitet, die Cylinder-Klasse wiederum von der Circle-Klasse. Der Konstruktor jeder abgeleiteten Klasse verwendet die jeweilige Basisklasseninitialisierung.

abstract class Shape
{
    public const double pi = Math.PI;
    protected double x, y;

    public Shape(double x, double y)
    {
        this.x = x;
        this.y = y;
    }

    public abstract double Area();
}

class Circle : Shape
{
    public Circle(double radius)
        : base(radius, 0)
    {
    }
    public override double Area()
    {
        return pi * x * x;
    }
}

class Cylinder : Circle
{
    public Cylinder(double radius, double height)
        : base(radius)
    {
        y = height;
    }

    public override double Area()
    {
        return (2 * base.Area()) + (2 * pi * x * y);
    }
}

class TestShapes
{
    static void Main()
    {
        double radius = 2.5;
        double height = 3.0;

        Circle ring = new Circle(radius);
        Cylinder tube = new Cylinder(radius, height);

        Console.WriteLine("Area of the circle = {0:F2}", ring.Area());
        Console.WriteLine("Area of the cylinder = {0:F2}", tube.Area());

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/* Output:
    Area of the circle = 19.63
    Area of the cylinder = 86.39
*/

Weitere Beispiele zum Aufrufen von Basisklassenkonstruktoren finden Sie unter virtual (C#-Referenz), override (C#-Referenz) und base (C#-Referenz).

Siehe auch

Referenz

Klassen und Strukturen (C#-Programmierhandbuch)

Konstruktoren (C#-Programmierhandbuch)

Destruktoren (C#-Programmierhandbuch)

static (C#-Referenz)

Konzepte

C#-Programmierhandbuch