Eigenschaften (C#-Programmierhandbuch)Properties (C# Programming Guide)

Eine Eigenschaft ist ein Member, das einen flexiblen Mechanismus zum Lesen, Schreiben oder Berechnen des Werts eines privaten Felds bietet.A property is a member that provides a flexible mechanism to read, write, or compute the value of a private field. Eigenschaften können wie öffentliche Datenmember verwendet werden, es sind jedoch spezielle Methoden namens Accessoren.Properties can be used as if they are public data members, but they are actually special methods called accessors. Dies ermöglicht den problemlosen Datenzugriff und unterstützt weiterhin die Sicherheit und Flexibilität der Methoden.This enables data to be accessed easily and still helps promote the safety and flexibility of methods.

Übersicht über EigenschaftenProperties overview

  • Mithilfe von Eigenschaften kann eine Klasse eine öffentliche Methode zum Abrufen und Festlegen von Werten verfügbar machen und dabei den Implementierungs- oder Verifizierungscode ausblenden.Properties enable a class to expose a public way of getting and setting values, while hiding implementation or verification code.

  • Eine get-Eigenschaftenaccessor wird verwendet, um den Wert der Eigenschaft zurückzugeben. Ein set-Eigenschaftenaccessor wird verwendet, um einen neuen Wert zuzuweisen.A get property accessor is used to return the property value, and a set property accessor is used to assign a new value. Diese Zugriffsmethoden können über verschiedene Zugriffsebenen verfügen.These accessors can have different access levels. Weitere Informationen finden Sie unter Einschränken des Accessorzugriffs.For more information, see Restricting Accessor Accessibility.

  • Das value-Schlüsselwort wird verwendet, um den Wert zu definieren, der vom set-Accessor zugewiesen wird.The value keyword is used to define the value being assigned by the set accessor.

  • Eigenschaften können sein: Lesen/Schreiben (beide verfügen über einen get- und set-Accessor), schreibgeschützt (verfügen über einen get-Accessor, jedoch keinen set-Accessor), oder lesegeschützt (verfügen über einen set-Accessor, jedoch keinen get Accessor).Properties can be read-write (they have both a get and a set accessor), read-only (they have a get accessor but no set accessor), or write-only (they have a set accessor, but no get accessor). Lesegeschützte Eigenschaften sind selten und werden am häufigsten verwendet, um den Zugriff auf vertrauliche Daten einzuschränken.Write-only properties are rare and are most commonly used to restrict access to sensitive data.

  • Einfache Eigenschaften, die keinen benutzerdefinierten Accessorcode erfordern können implementiert werden, entweder als Ausdruckstextdefinitionen oder als automatisch implementierte Eigenschaften.Simple properties that require no custom accessor code can be implemented either as expression body definitions or as auto-implemented properties.

Eigenschaften mit UnterstützungsfeldernProperties with backing fields

Ein grundlegendes Muster zum Implementieren einer Eigenschaft umfasst ein privates Unterstützungsfeld zum Festlegen und Abrufen des Eigenschaftswerts.One basic pattern for implementing a property involves using a private backing field for setting and retrieving the property value. Der get-Accessor gibt den Wert des privaten Felds zurück, und der set-Accessor kann die Validierung einiger Daten ausführen, bevor er dem privaten Feld einen Wert zuweist.The get accessor returns the value of the private field, and the set accessor may perform some data validation before assigning a value to the private field. Beide Accessoren führen möglicherweise eine Konvertierung oder eine Berechnung der Daten aus, bevor sie gespeichert oder zurückgegeben werden.Both accessors may also perform some conversion or computation on the data before it is stored or returned.

Dieses Muster wird anhand des folgenden Beispiels veranschaulicht.The following example illustrates this pattern. In diesem Beispiel stellt die TimePeriod-Klasse ein Zeitintervall dar.In this example, the TimePeriod class represents an interval of time. Intern speichert die Klasse das Zeitintervall in Sekunden in einem privaten Feld mit dem Namen seconds.Internally, the class stores the time interval in seconds in a private field named seconds. Eine Schreib-Lese-Eigenschaft mit dem Namen Hours ermöglicht dem Kunden, das Zeitintervall in Stunden anzugeben.A read-write property named Hours allows the customer to specify the time interval in hours. Die get- und set-Accessoren führen jeweils die notwendige Konvertierung zwischen Stunden und Sekunden durch.Both the get and the set accessors perform the necessary conversion between hours and seconds. Darüber hinaus prüft der set-Accessor die Daten, und löst eine ArgumentOutOfRangeException aus, wenn die Anzahl von Stunden ungültig ist.In addition, the set accessor validates the data and throws an ArgumentOutOfRangeException if the number of hours is invalid.

using System;

class TimePeriod
{
   private double seconds;

   public double Hours
   {
       get { return seconds / 3600; }
       set { 
          if (value < 0 || value > 24)
             throw new ArgumentOutOfRangeException(
                   $"{nameof(value)} must be between 0 and 24.");

          seconds = value * 3600; 
       }
   }
}

class Program
{
   static void Main()
   {
       TimePeriod t = new TimePeriod();
       // The property assignment causes the 'set' accessor to be called.
       t.Hours = 24;

       // Retrieving the property causes the 'get' accessor to be called.
       Console.WriteLine($"Time in hours: {t.Hours}");
   }
}
// The example displays the following output:
//    Time in hours: 24

AusdruckstextdefinitionenExpression body definitions

Häufig bestehen Eigenschaftenaccessoren aus einzeilige Anweisungen, die gerade das Ergebnis eines Ausdrucks zuweisen oder zurückgeben.Property accessors often consist of single-line statements that just assign or return the result of an expression. Sie können diese Eigenschaften als Ausdruckskörpermember implementieren.You can implement these properties as expression-bodied members. Ausdruckstextdefinitionen bestehen aus dem =>-Symbol, gefolgt von dem Ausdruck, der der Eigenschaft zugewiesen oder aus dieser abgerufen werden soll.Expression body definitions consist of the => symbol followed by the expression to assign to or retrieve from the property.

Beginnend mit dem C# 6, können schreibgeschützte Eigenschaften den get-Accessor als Ausdruckskörpermember implementieren.Starting with C# 6, read-only properties can implement the get accessor as an expression-bodied member. In diesem Fall werden weder das get-Accessorschlüsselwort noch das return-Schlüsselwort verwendet.In this case, neither the get accessor keyword nor the return keyword is used. Das folgende Beispiel implementiert die schreibgeschützte Name-Eigenschaft als ein Ausdruckskörpermember.The following example implements the read-only Name property as an expression-bodied member.

using System;

public class Person
{
   private string firstName;
   private string lastName;
   
   public Person(string first, string last)
   {
      firstName = first;
      lastName = last;
   }

   public string Name => $"{firstName} {lastName}";   
}

public class Example
{
   public static void Main()
   {
      var person = new Person("Isabelle", "Butts");
      Console.WriteLine(person.Name);
   }
}
// The example displays the following output:
//      Isabelle Butts

Beginnen mit C# 7, könne jeweils der get- und set-Accessor als Ausdruckskörpermember implementiert werden.Starting with C# 7, both the get and the set accessor can be implemented as expression-bodied members. In diesem Fall müsse die get- und set-Schlüsselwörter vorhanden sein.In this case, the get and set keywords must be present. Das folgende Beispiel veranschaulicht die Verwendung von Ausdruckstextdefinitionen für beide Accessoren.The following example illustrates the use of expression body definitions for both accessors. Beachten Sie, dass das return-Schlüsselwort nicht mit dem get-Accessor verwendet wird.Note that the return keyword is not used with the get accessor.

using System;

public class SaleItem
{
   string name;
   decimal cost;
   
   public SaleItem(string name, decimal cost)
   {
      this.name = name;
      this.cost = cost;
   }

   public string Name 
   {
      get => name;
      set => name = value;
   }

   public decimal Price
   {
      get => cost;
      set => cost = value; 
   }
}

class Program
{
   static void Main(string[] args)
   {
      var item = new SaleItem("Shoes", 19.95m);
      Console.WriteLine($"{item.Name}: sells for {item.Price:C2}");
   }
}
// The example displays output like the following:
//       Shoes: sells for $19.95



Automatisch implementierte EigenschaftenAuto-implemented properties

In einigen Fällen weisen die Eigenschaft get- und set-Accessoren nur einen Wert zu oder rufen einen Wert aus einem Unterstützungsfeld ab, ohne zusätzliche Logik.In some cases, property get and set accessors just assign a value to or retrieve a value from a backing field without including any additional logic. Mithilfe von automatisch implementierten Eigenschaften können Sie Ihren Code vereinfachen, während der C#-Compiler das Unterstützungsfeld für Sie transparent bereitstellt.By using auto-implemented properties, you can simplify your code while having the C# compiler transparently provide the backing field for you.

Wenn eine Eigenschaft jeweils über einen get- und set-Accessor verfügt, müssen beide automatisch implementiert werden.If a property has both a get and a set accessor, both must be auto-implemented. Definieren Sie eine automatisch implementierte Eigenschaft mithilfe der get- und set-Schlüsselwörter ohne jede Implementierung.You define an auto-implemented property by using the get and set keywords without providing any implementation. Im folgenden Beispiel wird das vorherige Beispiel wiederholt, außer das Name und Price automatisch implementierte Eigenschaften sind.The following example repeats the previous one, except that Name and Price are auto-implemented properties. Beachten Sie, dass das Beispiel auch den parametrisierten Konstruktor entfernt, damit SaleItem-Objekte jetzt mit einem Aufruf vom Standardkonstruktor und vom Objektinitialisierer initialisiert werden.Note that the example also removes the parameterized constructor, so that SaleItem objects are now initialized with a call to the default constructor and an object initializer.

using System;

public class SaleItem
{
   public string Name 
   { get; set; }

   public decimal Price
   { get; set; }
}

class Program
{
   static void Main(string[] args)
   {
      var item = new SaleItem{ Name = "Shoes", Price = 19.95m };
      Console.WriteLine($"{item.Name}: sells for {item.Price:C2}");
   }
}
// The example displays output like the following:
//       Shoes: sells for $19.95



C#-ProgrammiersprachenspezifikationC# Language Specification

Weitere Informationen erhalten Sie unter C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.

Siehe auchSee also

C#-ProgrammierhandbuchC# Programming Guide
Verwenden von EigenschaftenUsing Properties
IndexerIndexers
get-Schlüsselwort get keyword
set-Schlüsselwortset keyword