Expression-těle členové (Průvodce programováním v C#)
Definice textu výrazu umožňují poskytovat implementaci člena ve velmi stručné a čitelné podobě. Definici těla výrazu můžete použít vždy, když logika pro libovolný podporovaný člen, jako je například metoda nebo vlastnost, se skládá z jednoho výrazu. Definice těla výrazu má následující obecnou syntaxi:
member => expression;
výraz WHERE je platný výraz.
Pro metody a vlastnosti jen pro čtení v C# 6 byly zavedeny podpory pro definice těla výrazu a rozšířily se v C# 7,0. Definice textu výrazu lze použít s členy typu uvedenými v následující tabulce:
| Člen | Podporováno pro... |
|---|---|
| Metoda | C# 6 |
| Vlastnost jen pro čtení | C# 6 |
| Vlastnost | C# 7.0 |
| Konstruktor | C# 7.0 |
| Finalizační metodu | C# 7.0 |
| Indexer | C# 7.0 |
Metody
Metoda těle výrazu se skládá z jednoho výrazu, který vrací hodnotu, jejíž typ odpovídá návratového typu metody, nebo pro metody, které vracejí void , které provádí určitou operaci. Například typy, které přepisují ToString metodu obvykle zahrnují jeden výraz, který vrací řetězcovou reprezentaci aktuálního objektu.
Následující příklad definuje Person třídu, která přepisuje ToString metodu pomocí definice těla výrazu. Definuje také DisplayName metodu, která zobrazí název konzole. Všimněte si, že return klíčové slovo se v ToString definici těla výrazu nepoužívá.
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();
}
}
Další informace naleznete v tématu metody (Průvodce programováním v C#).
Vlastnosti jen pro čtení
Počínaje jazykem C# 6 můžete použít definici textu výrazu k implementaci vlastnosti jen pro čtení. K tomu použijte následující syntaxi:
PropertyType PropertyName => expression;
Následující příklad definuje Location třídu, jejíž vlastnost jen pro čtení Name je implementována jako definice těla výrazu, která vrací hodnotu soukromého locationName pole:
public class Location
{
private string locationName;
public Location(string name)
{
locationName = name;
}
public string Name => locationName;
}
Další informace o vlastnostech naleznete v tématu Properties (Průvodce programováním v C#).
Vlastnosti
Počínaje jazykem C# 7,0 můžete použít definice těla výrazu k implementaci vlastností get a set přístupových objektů. Následující příklad ukazuje, jak to provést:
public class Location
{
private string locationName;
public Location(string name) => Name = name;
public string Name
{
get => locationName;
set => locationName = value;
}
}
Další informace o vlastnostech naleznete v tématu Properties (Průvodce programováním v C#).
Konstruktory
Definice těla výrazu pro konstruktor se obvykle skládá z jednoho výrazu přiřazení nebo volání metody, které zpracovává argumenty konstruktoru nebo inicializuje stav instance.
Následující příklad definuje třídu, Location jejíž konstruktor má jeden řetězcový parametr s názvem Name. Definice těla výrazu přiřadí argument Name Vlastnosti.
public class Location
{
private string locationName;
public Location(string name) => Name = name;
public string Name
{
get => locationName;
set => locationName = value;
}
}
Další informace naleznete v tématu konstruktory (Průvodce programováním v C#).
Finalizační metody
Definice těla výrazu pro finalizační metodu obvykle obsahuje příkazy vyčištění, například příkazy, které uvolní nespravované prostředky.
Následující příklad definuje finalizační metodu, která používá definici těla výrazu k označení toho, že finalizační metoda byla volána.
using System;
public class Destroyer
{
public override string ToString() => GetType().Name;
~Destroyer() => Console.WriteLine($"The {ToString()} finalizer is executing.");
}
Další informace naleznete v tématu finalizační metody (Průvodce programováním v C#).
Indexery
Podobně jako u vlastností jsou indexery get a set přistupující objekty tvořeny definicemi těla výrazu get , pokud se přistupující objekt skládá z jediného výrazu, který vrací hodnotu nebo set přistupující objekt provádí jednoduché přiřazení.
Následující příklad definuje třídu s názvem Sports , která obsahuje interní String pole, které obsahuje názvy pro řadu sportovních. Indexer get i set přistupující objekty jsou implementovány jako definice textu výrazu.
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;
}
}
Další informace najdete v tématu indexery (Průvodce programováním v C#).