Member mit Ausdruckskörper bieten eine minimale und prägnante Syntax zum Definieren von Eigenschaften und Methoden. Es hilft, Boilerplate-Code zu eliminieren und Code zu schreiben, der besser lesbar ist. Die Ausdruckskörpersyntax kann verwendet werden, wenn der Körper eines Mitglieds nur aus einem Ausdruck besteht. Es verwendet den Operator => (f at arrow ), um den Hauptteil der Methode oder Eigenschaft zu definieren, und ermöglicht es, geschweifte Klammern und das Schlüsselwort return loszuwerden . Das Feature wurde erstmals in C# 6 eingeführt.

Expression-Bodied-Methoden

In C# ist eine Methode eine Sammlung von Anweisungen, die eine bestimmte Aufgabe ausführen und das Ergebnis an den Aufrufer zurückgeben. Oftmals enthalten Methoden am Ende nur eine einzige Anweisung. Betrachten Sie beispielsweise den folgenden Code:

int GetRectangleArea(int length, int breadth) 
{
    return length * breadth;
} 

Die obige Methode besteht nur aus einer einzigen return-Anweisung. Unter Verwendung der Ausdruckskörpersyntax kann die obige Methode wie folgt umgeschrieben werden:

int GetRectangleArea(int length, int breadth) => length * breadth;

Beachten Sie, dass die geschweiften Klammern und die return - Anweisung fehlen. Anstelle von geschweiften Klammern wurde der Operator => verwendet. Der Ausdruck, der nach der return -Anweisung folgt, steht direkt hinter dem => -Operator.

Syntax

[Zugriffsmodifikator] [Qualifizierer] Rückgabetyp Methodenname([Parameter]) => Ausdruck;

Beispiel

Das folgende Beispiel definiert eine boolesche Methode namens IsEven() , die true zurückgibt, wenn die an sie übergebene Zahl gerade ist, andernfalls gibt die Methode false zurück. Die Methode IsEven() verwendet Ausdruckssyntax.

C#

// C# program to illustrate expression bodied method
using System;
  
class GFG{
      
// Returns true if number is even
// else returns false
public static bool IsEven(int number) => number % 2 == 0;
  
// Driver code
public static void Main()
{
    int n = 10;
      
    if (IsEven(n))
    {
          Console.WriteLine("{0} is even", n);
    }
    else 
    {
        Console.WriteLine("{0} is odd", n);
    }
}
}
Ausgabe
10 ist gerade

Expression-Bodied-Void-Methoden 

Void-Methoden sind solche Methoden, die keine return -Anweisung enthalten und nur aus einer einzigen Anweisung bestehen, die auch Ausdruckskörper-Syntax verwenden können. Zum Beispiel die folgende Methode:

void PrintName(string name)
{
    Console.WriteLine($"The name is {name}");
}

kann mit Ausdruckskörpersyntax wie folgt geschrieben werden:

void PrintName(string name) => Console.WriteLine($"The name is {name}"); 

Eigenschaften des Ausdruckskörpers

Eigenschaftszugriffsmethoden können auch nur eine Anweisung haben. Mit Ausdruckskörpereigenschaften können solche Eigenschaftsdefinitionen vereinfacht werden.

1. Schreibgeschützte Eigenschaften

Schreibgeschützte Eigenschaften sind Eigenschaften, die nur einen Get - Accessor haben, wie die folgenden:

public int Name 
{ 
    get 
    {
        return "Geeks For Geeks";
    }
}  

Unter Verwendung der Ausdruckskörpersyntax kann die Eigenschaft wie folgt definiert werden:

public int Name => "Geeks For Geeks";

Syntax

[Zugriffsmodifikator] [Qualifizierer] type PropertyName => Ausdruck;

Beispiel

Das folgende Beispiel definiert eine Klasse namens Square mit einem Konstruktor, der die Seitenlänge des Quadrats akzeptiert. Nachdem die Seite im Konstruktor festgelegt wurde, kann sie nicht geändert werden, da die öffentliche Side -Eigenschaft schreibgeschützt ist. Außerdem ist das Seitenfeld privat und kann nicht von außerhalb der Klasse aufgerufen werden.

C#

// C# program to illustrate expression bodied properties
using System;
  
public class Square 
{
    private int side;
    
    public Square(int side) 
    {
        this.side = side;
    }
      
    public int Side => side;
}
  
class GFG{
  
// Driver code
public static void Main()
{
    var square = new Square(4);
    Console.WriteLine($"Side is {square.Side}");
}
}
Ausgabe
Seite ist 4

2. Nicht schreibgeschützte Eigenschaften

Seit C# 7 können nicht schreibgeschützte Eigenschaften auch Get- und Set- Accessoren mit Ausdruckskörper haben. In der folgenden Person -Klasse definiert die Name - Eigenschaft sowohl get- als auch set- Accessoren mit jeweils nur einer Anweisung:

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

Dies kann durch die Verwendung von Ausdruckskörper-Accessoren vereinfacht werden:

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

Syntax

[Zugriffsmodifikator] [Qualifizierer] [Typ] PropertyName

{

    erhalten => Ausdruck;

    set => Ausdruck;

}

Beispiel

Der folgende Code definiert eine Square -Klasse wie im obigen Beispiel, aber hier hat die Side-Eigenschaft auch einen set- Accessor. Außerdem wurde anstelle eines Konstruktors ein Objektinitialisierer verwendet, um den Anfangswert für die Side - Eigenschaft bereitzustellen:

C#

// C# program to illustrate expression bodied properties
using System;
  
public class Square 
{
    private int side;
    
    public int Side 
    {
        get => side;
        set => side = value;
    }
}
  
class GFG{
  
// Driver code    
public static void Main()
{
    var square = new Square{Side = 4};
    Console.WriteLine($"Side is {square.Side}");
    square.Side = 10;
      Console.WriteLine($"Side is now {square.Side}");
}
}
Ausgabe
Seite ist 4
Seite ist jetzt 10

Ausdruckskörperkonstruktoren und -destruktoren

Die Syntax mit Ausdruckskörper wurde ebenfalls erweitert, um mit Konstruktoren und Destruktoren / Finalizern verwendet zu werden . Wenn eine dieser Methoden nur eine einzige Anweisung enthält, können sie als Ausdruckskörper definiert werden. 

Syntax

  • Konstrukteure

[Zugriffsmodifizierer] Klassenname([Parameter]) => Ausdruck;

  • Destruktoren/Finalizer

~Klassenname()=> Ausdruck;

Beispiel

Im folgenden Beispiel definiert die Square -Klasse einen Konstruktor und einen Destruktor, die jeweils eine Ausdruckskörperdefinition enthalten:

C#

// C# program to illustrate expression-bodied 
// constructors and destructors
using System;
  
public class Square 
{
    private int side;
    
    public Square(int side) => this.side = side;
      
    ~Square() => Console.WriteLine("Square's Destructor");
    
    public int Side => side;
}
  
class GFG{
  
// Driver code
public static void Main()
{
    var square = new Square(4);
    Console.WriteLine($"Side is {square.Side}");
}
}
Ausgabe
Seite ist 4
Squares Destruktor

Indexer mit Ausdruckskörper

Ähnlich wie Eigenschaften können Indexer -Zugriffsmethoden auch Ausdruckskörper sein. Indexerdefinitionen folgen denselben Konventionen wie Eigenschaften, was bedeutet, dass schreibgeschützte Indexer ohne Angabe des Accessors definiert werden können und Lese- und Schreibzugriffe den Namen des Accessors erfordern.

Syntax

  • Nur-Lese-Indexer

[Zugriffsmodifikator] [Qualifizierer] Rückgabetyp this[ [Parameter] ] => Ausdruck;

  • Indexer lesen und schreiben

[Zugriffsmodifikator] [Qualifizierer] Rückgabetyp this [ [Parameter] ]



{

    erhalten => Ausdruck;

    set => Ausdruck;

}

Beispiel

Die folgende Klasse ProgrammingLangs definiert eine String-Array-Sprache von Programmiersprachen und definiert auch einen Indexer, der die Indizes an das Sprachen -Array weiterleitet und das Element (die Sprache) an diesem Index zurückgibt. Der Indexer ist schreibgeschützt, daher können die Sprachen im Array nicht außerhalb der Klasse geändert werden.

C#

// C# program to illustrate expression-bodied indexers
using System;
  
public class ProgrammingLangs
{
    private string[] languages = 
    {
        "C#",
        "C",
        "C++",
        "Python",
        "Java"
    };
    
    public string this[int idx] => languages[idx];
}
  
class GFG{
  
// Driver code
public static void Main()
{
    var langs = new ProgrammingLangs();
    Console.WriteLine(langs[0]);
      Console.WriteLine(langs[2]);
      Console.WriteLine(langs[3]);
}
}
Ausgabe
C#
C++
Python

Operatorfunktionen mit Ausdruckskörper

So wie gewöhnliche Methoden mit einer einzelnen Anweisung Ausdruckskörper sein können, können auch Operatormethodendefinitionen Ausdruckskörper sein, wenn ihr Körper aus einer einzelnen Anweisung besteht.

Syntax

[Zugriffsmodifikator] Statischer Operator [Operatorsymbol] ([Parameter]) => Ausdruck;

Beispiel

Das folgende Beispiel implementiert eine Klasse Complex, die den Real- und Imaginärteil einer komplexen Zahl darstellt und außerdem den binären Operator + definiert, um die Addition von zwei Complex - Objekten zu ermöglichen. Die Funktion operator+ hat einen Ausdruckskörper.

C#

// C# program to illustrate expression-bodied operator functions
using System;
  
public struct Complex
{
    public int Real{get; set;}
    public int Imaginary{get; set;}
    
    public Complex(int real, int imaginary)
    {
        Real = real;
        Imaginary = imaginary;
    }
     
    // Expression-bodied operator method
    public static Complex operator + (
        Complex c1, Complex c2) =>
        new Complex(c1.Real + c1.Real,
               c1.Imaginary + c2.Imaginary);
    
    public override string ToString() => 
       $"({Real}) + ({Imaginary}i)";
}
  
class GFG{
  
// Driver code 
public static void Main()
{
    var a = new Complex(3, 2);
    var b = new Complex(1, 2);
    var result = a + b;
      
    Console.WriteLine($"{a} + {b} = {result}");
}
}

Ausgabe:

(3) + (2i) + (1) + (2i) = (6) + (4i)