Gewusst wie: Deklarieren und Verwenden von Lese-/Schreibeigenschaften (C#-Programmierhandbuch)

Aktualisiert: November 2007

Eigenschaften stellen die Vorteile von öffentlichen Datenmembern bereit, ohne die mit dem ungeschützten, nicht kontrollierten und nicht geprüften Zugriff auf die Daten eines Objekts verknüpften Risiken aufzuweisen. Dies wird durch Accessoren erreicht. Dies sind besondere Methoden, die den zugrunde liegenden Datenmembern Werte zuweisen bzw. diese Werte abrufen. Der set-Accessor ermöglicht das Zuweisen von Datenmembern, und der get-Accessor ruft Datenmemberwerte ab.

In diesem Beispiel wird eine Person-Klasse mit zwei Eigenschaften dargestellt: Name (Zeichenfolge) und Age (ganze Zahl). Beide Eigenschaften stellen einen get-Accessor und einen set-Accessor bereit, es handelt sich also um Lese-/Schreibeigenschaften.

Beispiel

class Person
{
    private string name = "N/A";
    private int age = 0;

    // Declare a Name property of type string:
    public string Name
    {
        get
        {
            return name;
        }
        set
        {
            name = value;
        }
    }

    // Declare an Age property of type int:
    public int Age
    {
        get
        {
            return age;
        }

        set
        {
            age = value;
        }
    }

    public override string ToString()
    {
        return "Name = " + Name + ", Age = " + Age;
    }
}

class TestPerson
{
    static void Main()
    {
        // Create a new Person object:
        Person person = new Person();

        // Print out the name and the age associated with the person:
        Console.WriteLine("Person details - {0}", person);

        // Set some values on the person object:
        person.Name = "Joe";
        person.Age = 99;
        Console.WriteLine("Person details - {0}", person);

        // Increment the Age property:
        person.Age += 1;
        Console.WriteLine("Person details - {0}", person);

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/* Output:
    Person details - Name = N/A, Age = 0
    Person details - Name = Joe, Age = 99
    Person details - Name = Joe, Age = 100
*/

Robuste Programmierung

Im vorherigen Beispiel sind die Name-Eigenschaft und die Age-Eigenschaft public und besitzen jeweils einen get-Accessor und einen set-Accessor. Auf diese Weise können diese Eigenschaften von allen Objekten gelesen und überschrieben werden. Bisweilen ist es jedoch auch erforderlich, einen der Accessoren auszuschließen. Indem Sie den set-Accessor auslassen, wandeln Sie die Eigenschaft beispielsweise in eine schreibgeschützte Eigenschaft um:

public string Name
{
    get
    {
        return name;
    }
}

Alternativ können Sie einen Accessor öffentlich verfügbar machen, während der andere als privat oder geschützt festgelegt wird. Weitere Informationen finden Sie unter Asymmetrischer Accessorzugriff.

Nachdem die Eigenschaften deklariert wurden, können Sie genauso wie Felder der Klasse verwendet werden. Daher kann sowohl beim Abrufen als auch beim Festlegen von Eigenschaftenwerten eine relativ natürliche Syntax verwendet werden. Siehe dazu folgende Anweisungen:

person.Name = "Joe";
person.Age = 99;

Beachten Sie, dass in der set-Methode einer Eigenschaft eine spezielle value-Variable verfügbar ist. Diese Variable enthält den vom Benutzer angegebenen Wert. Beispiel:

name = value;

Beachten Sie die einfache Syntax zum Erhöhen des Age-Eigenschaftenwerts eines Person-Objekts:

person.Age += 1;

Wenn getrennte set-Methoden und get-Methoden verwendet wurden, um Eigenschaften zu modellieren, könnte der entsprechende Code folgendermaßen aussehen:

person.SetAge(person.GetAge() + 1); 

Die ToString-Methode wird in diesem Beispiel überschrieben:

public override string ToString()
{
    return "Name = " + Name + ", Age = " + Age;
}

Beachten Sie, dass ToString im Programm nicht explizit verwendet wird. Es wird standardmäßig durch die WriteLine-Aufrufe aufgerufen.

Siehe auch

Konzepte

C#-Programmierhandbuch

Referenz

Eigenschaften (C#-Programmierhandbuch)

Klassen und Strukturen (C#-Programmierhandbuch)