Ausdruckskörper-Member in C#
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); } } }
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}"); } }
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}"); } }
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}"); } }
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]); } }
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)