Ausdruckskörpermember (C#-Programmierhandbuch)

Mit Ausdruckstextdefinitionen können Sie die Implementierung eines Members in einer sehr präzisen und lesbaren Form darstellen. Sie können eine Ausdruckstextdefinition verwenden, wann immer die Logik für einen unterstützten Member, z.B. eine Methode oder Eigenschaft, aus einem einzelnen Ausdruck besteht. Eine Ausdruckstextdefinition hat die folgende allgemeine Syntax:

member => expression;

wobei expression ein gültiger Ausdruck ist.

Die Unterstützung für Ausdruckstextdefinitionen wurde für Methoden und Get-Eigenschaftenzugriffsmethoden in C# 6 eingeführt und in C# 7 erweitert. Ausdruckstextdefinitionen können mit Typmember verwendet werden, die in der folgenden Tabelle aufgeführt sind:

Member Unterstützt ab...
Methode C# 6
Konstruktor C# 7
Finalizer C# 7
Get-Methode der Eigenschaft C# 6
Set-Methode der Eigenschaft C# 7
Indexer C# 7

Methoden

Eine Ausdruckskörpermethode besteht aus einem einzelnen Ausdruck, der einen Wert zurückgibt, dessen Typ mit dem Rückgabetyp der Methode übereinstimmt bzw. für Methoden, die void zurückgeben, das einige Vorgänge ausführt. Beispielsweise enthalten Typen, die die <xref:System.Object.ToString%2A>-Methode außer Kraft setzen normalerweise einen einzelnen Ausdruck, der die Zeichenfolgendarstellung des aktuellen Objekts zurückgibt.

Das folgende Beispiel definiert eine Person-Klasse, die die <xref:System.Object.ToString%2A>-Methode mit einer Ausdruckstextmethode außer Kraft setzt. Es wird auch eine Show-Methode definiert, die einen Namen für die Konsole anzeigt. Beachten Sie, dass das Schlüsselwort return nicht in der Ausdruckstextmethode ToString verwendet wird.

using System;

public class Person
{
   public Person(string firstName, string lastName)
   {
      fname = firstName;
      lname = lastName;
   }

   private string fname;
   private string lname;
   
   public override string ToString() => $"{fname} {lname}".Trim();
   public void DisplayName() => Console.WriteLine(ToString());
}

class Example
{
   static void Main()
   {
      Person p = new Person("Mandy", "Dejesus");
      Console.WriteLine(p);
      p.DisplayName();
   }
}

Weitere Informationen finden Sie unter Methoden (C#-Programmierhandbuch).

Konstruktoren

Eine Ausdruckstextdefinition für einen Konstruktor enthält in der Regel einen einzelnen Zuweisungsausdruck oder einen Methodenaufruf, der die Argumente des Konstruktors behandelt oder den Instanzzustand initialisiert.

Im folgenden Beispiel wird eine Location-Klasse definiert, deren Klassenkonstruktor einen einzelnen Zeichenfolgenparameter namens name enthält. Die Ausdruckstextdefinition weist das Argument für die Eigenschaft Name zu.

public class Location
{
   private string locationName;
   
   public Location(string name) => locationName = name;

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

Weitere Informationen finden Sie unter Konstruktoren (C#-Programmierhandbuch).

Finalizer

Eine Ausdruckstextdefinition für einen Finalizer enthält normalerweise Bereinigungsanweisungen, z.B. Anweisungen, die nicht verwaltete Ressourcen veröffentlichen.

Im folgenden Beispiel wird ein Finalizer definiert, der eine Ausdruckstextdefinition verwendet, um anzugeben, dass der Finalizer aufgerufen wurde.

using System;

public class Destroyer
{
   public override string ToString() => GetType().Name;
   
   ~Destroyer() => Console.WriteLine($"The {ToString()} destructor is executing.");
}

Weitere Informationen finden Sie unter Finalizer (C#-Programmierhandbuch).

Anweisungen der Get-Methode der Eigenschaft

Wenn Sie selbst einen Accessor der Get-Methode der Eigenschaft implementieren möchten, können Sie eine Ausdruckstextdefinition für Eigenschaftswerte verwenden, die den Eigenschaftswert einfach zurückgeben. Beachten sie, dass die Anweisung return nicht verwendet wird.

Im folgenden Beispiel wird eine Location.Name-Anweisung definiert, deren Accessor der Get-Methode der Eigenschaft den Wert des privaten locationName-Felds zurückgibt, das hinter der Eigenschaft liegt.

public class Location
{
   private string locationName;
   
   public Location(string name) => locationName = name;

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

Schreibgeschützte Eigenschaften, die eine Ausdruckstextdefinition verwenden, können ohne explizite set-Anweisung implementiert werden. Die Syntax lautet:

PropertyName => returnValue;

Das folgende Beispiel definiert eine Location-Klasse, deren schreibgeschützte Eigenschaft Name als Ausdruckstextdefinition implementiert wird, die den Wert des privaten locationName-Felds zurückgibt.

public class Location
{
   private string locationName;
   
   public Location(string name) => locationName = name;

   public string Name => locationName;
}

Weitere Informationen finden Sie unter Eigenschaften (C#-Programmierhandbuch).

Anweisungen der Set-Methode der Eigenschaft

Wenn Sie selbst einen Accessor der Set-Methode der Eigenschaft implementieren möchten, können Sie eine Ausdruckstextdefinition für einen Ausdruck mit nur einer Zeile verwenden, der dem Feld einen Wert zuweist, das hinter der Eigenschaft steht.

Im folgenden Beispiel wird eine Location.Name-Eigenschaft definiert, deren Set-Methode der Eigenschaft das Eingabeargument dem privaten locationName-Feld zuweist, das hinter der Eigenschaft steht.

public class Location
{
   private string locationName;
   
   public Location(string name) => locationName = name;

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

Weitere Informationen finden Sie unter Eigenschaften (C#-Programmierhandbuch).

Indexer

Genauso wie Eigenschaften bestehen die Accessoren der Get- und Set-Methode des Indexers aus Ausdruckstextdefinitionen, wenn der Get-Accessor aus einer einzelnen Anweisung besteht, die einen Wert zurückgibt, oder der Set-Accessor führt eine einfache Zuweisung aus.

Im folgenden Beispiel wird eine Klasse namens Sports definiert, die ein internes <xref:System.String>-Array enthält, das aus den Namen von verschiedenen Sportarten besteht. Die Get- und Set-Accessoren des Indexers werden als Ausdruckstextdefinitionen implementiert.

using System;
using System.Collections.Generic;

public class Sports
{
   private string[] types = { "Baseball", "Basketball", "Football", 
                              "Hockey", "Soccer", "Tennis", 
                              "Volleyball" }; 

   public string this[int i]
   {
      get => types[i];
      set => types[i] = value;
   }
}

Weitere Informationen finden Sie unter Indexer (C#-Programmierhandbuch).