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

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. Eigenschaften deklarieren Zugriffsmethoden: 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 eine get- und eine set-Zugriffsmethode bereit, es handelt sich also um Lese- bzw. 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;
    }
}

public class Wrapper
{
    private string _name = "N/A";
    public string Name
    {
        get
        {
            return _name;
        }
        private set
        {
            _name = value;
        }
    }

}

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
*/

Stabile Programmierung

Im vorherigen Beispiel sind die Name- und Age-Eigenschaften public (öffentlich) und besitzen jeweils einen get- und einen set-Accessor. Öffentliche Zugriffsmethoden ermöglichen es einem Objekt, diese Eigenschaften zu lesen und zu schreiben. Manchmal ist es jedoch wünschenswert, eine der Zugriffsmethoden auszuschließen. Sie können die set-Zugriffsmethode weglassen, um die Eigenschaft schreibgeschützt zu machen:

public string Name
{
    get
    {
        return _name;
    }
    private set
    {
        _name = value;
    }
}

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 Asymmetric Accessor Accessibility (Asymmetrischer Accessorzugriff).

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

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

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

_name = value;

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

person.Age += 1;

Wenn getrennte set- 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