Verwenden von Eigenschaften (C#-Programmierhandbuch)Using Properties (C# Programming Guide)

Eigenschaften kombinieren Aspekte der Felder und der Methoden.Properties combine aspects of both fields and methods. Für den Benutzer eines Objekts erscheint eine Eigenschaft wie ein Feld; der Zugriff auf die Eigenschaft erfordert dieselbe Syntax.To the user of an object, a property appears to be a field, accessing the property requires the same syntax. Für den Implementierer einer Klasse, besteht eine Eigenschaft aus einem oder zwei Codeblöcken, die einen get-Accessor und/oder einen set-Accessor darstellen.To the implementer of a class, a property is one or two code blocks, representing a get accessor and/or a set accessor. Der Codeblock für den get-Accessor wird ausgeführt, wenn die Eigenschaft gelesen wird; der Codeblock für den set-Accessor wird ausgeführt, wenn der Eigenschaft ein neuer Wert zugewiesen wird.The code block for the get accessor is executed when the property is read; the code block for the set accessor is executed when the property is assigned a new value. Eine Eigenschaft ohne einen set-Accessor ist schreibgeschützt.A property without a set accessor is considered read-only. Eine Eigenschaft ohne einen get-Accessor ist lesegeschützt.A property without a get accessor is considered write-only. Eine Eigenschaft, die beide Accessoren umfasst, ermöglicht Lese-/ Schreibzugriff.A property that has both accessors is read-write.

Im Gegensatz zu Feldern, werden Eigenschaften nicht als Variablen klassifiziert.Unlike fields, properties are not classified as variables. Aus diesem Grund können Sie Eigenschaften nicht als ref oder out-Parameter übergeben.Therefore, you cannot pass a property as a ref or out parameter.

Eigenschaften sind vielseitig verwendbar: Sie können Daten überprüfen, bevor sie eine Änderung zulassen. Sie können Daten in einer Klasse transparent verfügbar machen, in denen die Daten in Wirklichkeit von einer anderen Quelle abgerufen werden, z.B. einer Datenbank. Sie können eine Aktion ausführen, wenn Daten geändert werden, z.B. ein Ereignis auslösen, oder den Wert anderer Felder verändern.Properties have many uses: they can validate data before allowing a change; they can transparently expose data on a class where that data is actually retrieved from some other source, such as a database; they can take an action when data is changed, such as raising an event, or changing the value of other fields.

Eigenschaften werden im Klassenblock deklariert, indem die Zugriffsebene des Felds angegeben wird, gefolgt vom Typ der Eigenschaft, gefolgt vom Namen der Eigenschaft und gefolgt von einem Codeblock, der einen get-Accessor und/oder einen set Accessor deklariert.Properties are declared in the class block by specifying the access level of the field, followed by the type of the property, followed by the name of the property, and followed by a code block that declares a get-accessor and/or a set accessor. Zum Beispiel:For example:

public class Date
{
    private int month = 7;  // Backing store

    public int Month
    {
        get
        {
            return month;
        }
        set
        {
            if ((value > 0) && (value < 13))
            {
                month = value;
            }
        }
    }
}

In diesem Beispiel wird Month als Eigenschaft so deklariert, dass der set-Accessor dafür sorgen kann, dass der Month-Wert zwischen 1 und 12 festgelegt wird.In this example, Month is declared as a property so that the set accessor can make sure that the Month value is set between 1 and 12. Die Month-Eigenschaft verwendet ein privates Feld, um den tatsächlichen Wert nachzuverfolgen.The Month property uses a private field to track the actual value. Der tatsächliche Speicherort der Daten für eine Eigenschaft wird häufig als „Sicherungsspeicher“ der Eigenschaft bezeichnet.The real location of a property's data is often referred to as the property's "backing store." Es ist üblich für Eigenschaften, die privaten Felder als Sicherungsspeicher zu verwenden.It is common for properties to use private fields as a backing store. Das Feld wird als privat gekennzeichnet um sicherzustellen, dass es nur durch Aufrufen der Eigenschaft geändert werden kann.The field is marked private in order to make sure that it can only be changed by calling the property. Weitere Informationen zu öffentlichen und privaten Zugriffsbeschränkungen finden Sie unter Zugriffsmodifizierer.For more information about public and private access restrictions, see Access Modifiers.

Automatisch implementierte Eigenschaften stellen eine vereinfachte Syntax für einfache Eigenschaftendeklarationen bereit.Auto-implemented properties provide simplified syntax for simple property declarations. Weitere Informationen finden Sie unter Automatisch implementierte Eigenschaften.For more information, see Auto-Implemented Properties.

Der get-AccessorThe get Accessor

Der Text des get Accessors ähnelt dem einer Methode.The body of the get accessor resembles that of a method. Er muss einen Wert des Eigenschaftentyps zurückgeben.It must return a value of the property type. Die Ausführung des get Accessors entspricht dem Lesen des Wert des Felds.The execution of the get accessor is equivalent to reading the value of the field. Wenn Sie z.B. die private Variable vom get -Accessor zurückgeben und Optimierungen aktiviert sind, wird der Aufruf an die get-Accessor-Methode vom Compiler eingebettet, damit kein zusätzlicher Aufwand an Methodenaufrufen entsteht.For example, when you are returning the private variable from the get accessor and optimizations are enabled, the call to the get accessor method is inlined by the compiler so there is no method-call overhead. Allerdings kann eine get-Accessor-Methode kann nicht eingebettet werden, da der Compiler zum Zeitpunkt der Kompilierung nicht erkennt, welche Methode zur Laufzeit tatsächlich aufgerufen wird.However, a virtual get accessor method cannot be inlined because the compiler does not know at compile-time which method may actually be called at run time. Im folgenden finden Sie einen get-Accessor, der den Wert eines privaten Felds zurückgibt name:The following is a get accessor that returns the value of a private field name:

class Person
{
    private string name;  // the name field
    public string Name    // the Name property
    {
        get
        {
            return name;
        }
    }
}

Wenn Sie auf die Eigenschaft, außer als Ziel einer Zuweisung, verweisen, wird der get-Accessor aufgerufen, um den Wert der Eigenschaft zu lesen.When you reference the property, except as the target of an assignment, the get accessor is invoked to read the value of the property. Zum Beispiel:For example:

Person person = new Person();
//...

System.Console.Write(person.Name);  // the get accessor is invoked here

Der get Accessor muss mit einer return- oder einer throw-Anweisung enden, und die Steuerung darf nicht über den Accessortext hinausgehen.The get accessor must end in a return or throw statement, and control cannot flow off the accessor body.

Es ist ein unzulässiger Programmierstil den Zustand des Objekts mithilfe des get-Accessors zu verändern.It is a bad programming style to change the state of the object by using the get accessor. Der folgende Accessor hat z.B. den Nebeneffekt, dass der Zustand des Objekts, bei jedem Zugriff auf das number-Feld verändert wird.For example, the following accessor produces the side effect of changing the state of the object every time that the number field is accessed.

private int number;
public int Number
{
    get
    {
        return number++;   // Don't do this
    }
}

Der get-Accessor kann verwendet werden, um den Wert des Felds zurückzugeben, oder um den Wert des Felds zu berechnen und zurückgeben.The get accessor can be used to return the field value or to compute it and return it. Zum Beispiel:For example:

class Employee
{
    private string name;
    public string Name
    {
        get
        {
            return name != null ? name : "NA";
        }
    }
}

Im vorherigen Codesegment, wenn Sie der Name-Eigenschaft keinen Wert zuweisen, wird der Wert NA zurückgegeben.In the previous code segment, if you do not assign a value to the Name property, it will return the value NA.

Der set-AccessorThe set Accessor

Der set-Accessor ähnelt einer Methode, deren Rückgabetyp void ist.The set accessor resembles a method whose return type is void. Er verwendet einen impliziten Parameter mit dem Namen value, dessen Typ der Typ der Eigenschaft ist.It uses an implicit parameter called value, whose type is the type of the property. Im folgenden Beispiel wird ein set-Accessor der Name-Eigenschaft hinzugefügt.In the following example, a set accessor is added to the Name property:

class Person
{
    private string name;  // the name field
    public string Name    // the Name property
    {
        get
        {
            return name;
        }
        set
        {
            name = value;
        }
    }
}

Wenn Sie der Eigenschaft einen Wert zuweisen, wird der set-Accessor mit einem Argument aufgerufen, das den neuen Wert bereitstellt.When you assign a value to the property, the set accessor is invoked by using an argument that provides the new value. Zum Beispiel:For example:

Person person = new Person();
person.Name = "Joe";  // the set accessor is invoked here                

System.Console.Write(person.Name);  // the get accessor is invoked here

Das Verwenden des impliziten Parameternamens, value, für die Deklaration einer lokalen Variablen in einem set-Accessor ist ein Fehler.It is an error to use the implicit parameter name, value, for a local variable declaration in a set accessor.

HinweiseRemarks

Eigenschaften können gekennzeichnet werden, als public, private, protected, internal, protected internal oder private protected.Properties can be marked as public, private, protected, internal, protected internal or private protected. Diese Zugriffsmodifizierer definieren, wie Benutzer der Klasse auf die Eigenschaft zugreifen können.These access modifiers define how users of the class can access the property. Die get- und set-Accessoren für die gleiche Eigenschaft haben möglicherweise verschiedene Zugriffsmodifizierer.The get and set accessors for the same property may have different access modifiers. Z.B. kann get möglicherweise public sein, um den schreibgeschützten Zugriff von außerhalb des Typs zu ermöglichen, und set kann möglicherweise private oder protected sein.For example, the get may be public to allow read-only access from outside the type, and the set may be private or protected. Weitere Informationen finden Sie unter Zugriffsmodifizierer.For more information, see Access Modifiers.

Eine Eigenschaft kann als statische Eigenschaft deklariert werden, mithilfe des static-Schlüsselworts.A property may be declared as a static property by using the static keyword. Dadurch steht das Feld Aufrufern jederzeit zur Verfügung, auch wenn keine Instanz der Klasse vorhanden ist.This makes the property available to callers at any time, even if no instance of the class exists. Weitere Informationen finden Sie unter Statische Klassen und statische Klassenmember.For more information, see Static Classes and Static Class Members.

Ein Ereignis kann mithilfe des virtual-Schlüsselworts als virtuelles Ereignis gekennzeichnet werden.A property may be marked as a virtual property by using the virtual keyword. Dies ermöglicht abgeleiteten Klassen, das Ereignisverhalten mithilfe des override-Schlüsselworts zu überschreiben.This enables derived classes to override the property behavior by using the override keyword. Weitere Informationen zu diesen Optionen finden Sie unter Vererbung.For more information about these options, see Inheritance.

Ein Ereignis, das ein virtuelles Ereignis überschreibt, kann auch sealed(verschlossen) sein, was angibt, dass es für abgeleitete Klassen nicht mehr virtuell ist.A property overriding a virtual property can also be sealed, specifying that for derived classes it is no longer virtual. Schließlich kann eine Eigenschaft als abstract(abstrakt) deklariert werden.Lastly, a property can be declared abstract. Dies bedeutet, dass es keine Implementierung in der Klasse gibt, und abgeleitete Klassen müssen eine eigene Implementierung schreiben.This means that there is no implementation in the class, and derived classes must write their own implementation. Weitere Informationen zu abstrakten Klassen finden Sie unter Abstrakte und versiegelte Klassen und Klassenmember.For more information about these options, see Abstract and Sealed Classes and Class Members.

Hinweis

Das Verwenden eines virtual(virtuell)-, abstract(abstrakt)- oder override(außer Kraft setzen)- Modifizierers für einen Accessor einer statischen Eigenschaft ist ein Fehler.It is an error to use a virtual, abstract, or override modifier on an accessor of a static property.

BeispielExample

Dieses Beispiel zeigt,Instanz-, statische- und schreibgeschützte Eigenschaften.This example demonstrates instance, static, and read-only properties. Dieser Parameter akzeptiert den Namen des Mitarbeiters auf der Tastatur, Inkremente NumberOfEmployees durch 1, und zeigt den Mitarbeiternamen und die Nummer an.It accepts the name of the employee from the keyboard, increments NumberOfEmployees by 1, and displays the Employee name and number.

public class Employee
{
    public static int NumberOfEmployees;
    private static int counter;
    private string name;

    // A read-write instance property:
    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    // A read-only static property:
    public static int Counter
    {
        get { return counter; }
    }

    // A Constructor:
    public Employee()
    {
        // Calculate the employee's number:
        counter = ++counter + NumberOfEmployees;
    }
}

class TestEmployee
{
    static void Main()
    {
        Employee.NumberOfEmployees = 107;
        Employee e1 = new Employee();
        e1.Name = "Claude Vige";

        System.Console.WriteLine("Employee number: {0}", Employee.Counter);
        System.Console.WriteLine("Employee name: {0}", e1.Name);
    }
}
/* Output:
    Employee number: 108
    Employee name: Claude Vige
*/

BeispielExample

In diesem Beispiel wird veranschaulicht, wie auf eine Eigenschaft in einer Basisklasse zugegriffen werden kann, die von einer anderen Eigenschaft ausgeblendet ist, die in einer abgeleiteten Klasse den gleichen Namen hat.This example demonstrates how to access a property in a base class that is hidden by another property that has the same name in a derived class.

public class Employee
{
    private string name;
    public string Name
    {
        get { return name; }
        set { name = value; }
    }
}

public class Manager : Employee
{
    private string name;

    // Notice the use of the new modifier:
    public new string Name
    {
        get { return name; }
        set { name = value + ", Manager"; }
    }
}

class TestHiding
{
    static void Main()
    {
        Manager m1 = new Manager();

        // Derived class property.
        m1.Name = "John";

        // Base class property.
        ((Employee)m1).Name = "Mary";

        System.Console.WriteLine("Name in the derived class is: {0}", m1.Name);
        System.Console.WriteLine("Name in the base class is: {0}", ((Employee)m1).Name);
    }
}
/* Output:
    Name in the derived class is: John, Manager
    Name in the base class is: Mary
*/

Die folgenden Punkte im vorherigen Beispiel sind wichtig:The following are important points in the previous example:

  • Die Eigenschaft Name in der abgeleiteten Klasse blendet die Eigenschaft Name in der Basisklasse aus.The property Name in the derived class hides the property Name in the base class. In solch einem Fall wird der new-Modifizierer in der Deklaration der Eigenschaft in der abgeleiteten Klasse verwendet:In such a case, the new modifier is used in the declaration of the property in the derived class:

    public new string Name
    
  • Die Umwandlung (Employee) wird für den Zugriff auf die ausgeblendete Eigenschaft in der Basisklasse verwendet:The cast (Employee) is used to access the hidden property in the base class:

    ((Employee)m1).Name = "Mary";
    

    Weitere Informationen zum Ausblenden von Mitgliedern finden Sie unter new-Modifizierer.For more information about hiding members, see the new Modifier.

BeispielExample

In diesem Beispiel implementieren zwei Klassen Cube und Square eine abstrakte Klasse Shape, und überschreiben die abstrakte Area-Eigenschaft.In this example, two classes, Cube and Square, implement an abstract class, Shape, and override its abstract Area property. Beachten Sie die Verwendung des überschreiben-Modifizierers in den Eigenschaften.Note the use of the override modifier on the properties. Das Programm akzeptiert die Seite als Eingabe und berechnet die Bereiche für das Quadrat und den Cube.The program accepts the side as an input and calculates the areas for the square and cube. Das Programm akzeptiert auch den Bereich als Eingabe und berechnet die entsprechende Seite für das Quadrat und den Cube.It also accepts the area as an input and calculates the corresponding side for the square and cube.

abstract class Shape
{
    public abstract double Area
    {
        get;
        set;
    }
}

class Square : Shape
{
    public double side;

    public Square(double s)  //constructor
    {
        side = s;
    }

    public override double Area
    {
        get
        {
            return side * side;
        }
        set
        {
            side = System.Math.Sqrt(value);
        }
    }
}

class Cube : Shape
{
    public double side;

    public Cube(double s)
    {
        side = s;
    }

    public override double Area
    {
        get
        {
            return 6 * side * side;
        }
        set
        {
            side = System.Math.Sqrt(value / 6);
        }
    }
}

class TestShapes
{
    static void Main()
    {
        // Input the side:
        System.Console.Write("Enter the side: ");
        double side = double.Parse(System.Console.ReadLine());

        // Compute the areas:
        Square s = new Square(side);
        Cube c = new Cube(side);

        // Display the results:
        System.Console.WriteLine("Area of the square = {0:F2}", s.Area);
        System.Console.WriteLine("Area of the cube = {0:F2}", c.Area);
        System.Console.WriteLine();

        // Input the area:
        System.Console.Write("Enter the area: ");
        double area = double.Parse(System.Console.ReadLine());

        // Compute the sides:
        s.Area = area;
        c.Area = area;

        // Display the results:
        System.Console.WriteLine("Side of the square = {0:F2}", s.side);
        System.Console.WriteLine("Side of the cube = {0:F2}", c.side);
    }
}
/* Example Output:
    Enter the side: 4
    Area of the square = 16.00
    Area of the cube = 96.00

    Enter the area: 24
    Side of the square = 4.90
    Side of the cube = 2.00
*/

Siehe auchSee Also

C#-ProgrammierhandbuchC# Programming Guide
EigenschaftenProperties
SchnittstelleneigenschaftenInterface Properties
Automatisch implementierte EigenschaftenAuto-Implemented Properties