Instanzkonstruktoren (C#-Programmierhandbuch)

Instanzkonstruktoren werden zum Erstellen und Initialisieren von Instanzmembervariablen verwendet, wenn Sie die Ausdruck new verwenden, um ein Objekt einer Klasse zu erstellen. Sie müssen einen statischen Konstruktor definieren um eine statische Klasse oder eine statische Variable in einer nicht statischen Klasse zu initialisieren. Weitere Informationen finden Sie unter Statische Konstruktoren.

Im folgenden Beispiel wird die Verwendung eines Instanzkonstruktors veranschaulicht:

class CoOrds
{
    public int x, y;

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

Der Deutlichkeit halber enthält diese Klasse öffentliche Felder. Das Verwenden von öffentlichen Felder wird beim Programmieren nicht empfohlen, da so jede Methode im Programm uneingeschränkten und ungeprüften Zugriff auf das Innenleben eines Objekts erhält. Datenmember sollten im Allgemeinen privat sein. Außerdem sollte auf sie nur über Klassenmethoden und Eigenschaften zugegriffen werden.

Dieser Instanzkonstruktor wird aufgerufen, wenn ein Objekt basierend auf der CoOrds-Klasse erstellt wird. Ein derartiger Konstruktor, der keine Argumente akzeptiert, wird als Standardkonstruktor bezeichnet. Es kann jedoch oft hilfreich sein, weitere Konstruktoren bereitzustellen. Sie können beispielsweise einen Konstruktor in die CoOrds-Klasse einfügen, mit dem Sie die Anfangswerte der Datenmember angeben können:

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

Damit können CoOrd-Objekte mit Standard- oder spezifischen Anfangswerten erstellt werden. Dies geschieht wie folgt:

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

Wenn eine Klasse über keinen Konstruktor verfügt, wird automatisch ein Standardkonstruktor generiert, und die Objektfelder werden mit Standardwerte initialisiert. Ein int-Objekt wird beispielsweise auf 0 (null) initialisiert. Weitere Informationen zu Standardwerten finden Sie unter Tabelle für Standardwerte. Da der Standardkonstruktor der CoOrds-Klasse alle Datenmember auf 0 (null) initialisiert, kann er komplett entfernt werden, ohne dass die Arbeitsweise der Klasse geändert wird. Unter Beispiel 1 weiter unten in diesem Thema finden Sie ein vollständiges Beispiel mit mehreren Konstruktoren. Unter Beispiel 2 finden Sie ein Beispiel für einen automatisch generierten Konstruktor.

Instanzkonstruktoren können ebenfalls dazu verwendet werden, die Instanzkonstruktoren von Basisklassen aufzurufen. Der Klassenkonstruktor kann den Konstruktor der Basisklasse mit dem Initialisierer wie folgt aufrufen:

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

In diesem Beispiel übergibt die Circle-Klasse die Werte des Radius und der Höhe an den Konstruktor, der von Shape bereitgestellt wird, von dem Circle abgeleitet wird. Unter Beispiel 3 in diesem Thema finden Sie ein vollständiges Beispiel mit Shape und Circle.

Beispiel 1

Das folgende Beispiel veranschaulicht eine Klasse mit zwei Klassenkonstruktoren. Einer der Konstruktoren hat kein Argument und der andere verfügt über zwei.

class CoOrds
{
    public int x, y;

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

    // A 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 hat die Person-Klasse keine Konstruktoren. In einem solchen Fall wird automatisch ein Standardkonstruktor 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 der Standardwert von age 0 ist, und der Standardwert von name ist null. Weitere Informationen zu Standardwerten finden Sie unter Tabelle für Standardwerte.

Beispiel 3

Im folgenden Beispiel wird die Verwendung vom Basisklasseninitialisierer veranschaulicht. Die Circle-Klasse wird von der allgemeinen Klasse Shape abgeleitet, und die Cylinder-Klasse wird von der Circle-Klasse abgeleitet. Der Konstruktor von jeder abgeleiteten Klasse verwendet deren Basisklasseninitialisierer.

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 für das Aufrufen des Basisklassenkonstruktors finden Sie unter virtual, override und base.

Siehe auch

C#-Programmierhandbuch
Klassen und Strukturen
Konstruktoren
Finalizer
static