Elementy członkowskie wyrażeń (przewodnik programowania w języku C#)
Definicje treści wyrażeń umożliwiają podanie implementacji elementu członkowskiego w zwięzłym, czytelnym formularzu. Definicję treści wyrażenia można użyć za każdym razem, gdy logika dla dowolnego obsługiwanego elementu członkowskiego, takiego jak metoda lub właściwość, składa się z pojedynczego wyrażenia. Definicja treści wyrażenia ma następującą ogólną składnię:
member => expression;
gdzie wyrażenie jest prawidłowym wyrażeniem .
Definicje treści wyrażeń mogą być używane z następującymi elementami członkowskimi typu:
Metody
Metoda typu wyrażenie-bodied składa się z pojedynczego wyrażenia, które zwraca wartość, której typ pasuje do typu zwracanego metody, lub dla metod, które zwracają void
metodę , która wykonuje jakąś operację. Na przykład typy, które zastępują ToString metodę, zwykle zawierają pojedyncze wyrażenie, które zwraca reprezentację ciągu bieżącego obiektu.
W poniższym przykładzie zdefiniowano klasę, która zastępuje ToString metodę Person
definicją treści wyrażenia. Definiuje również metodę DisplayName
, która wyświetla nazwę konsoli. Słowo return
kluczowe nie jest używane w ToString
definicji treści wyrażenia.
using System;
namespace ExpressionBodiedMembers;
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();
}
}
Aby uzyskać więcej informacji, zobacz Metody (Przewodnik programowania w języku C#).
Właściwości tylko do odczytu
Aby zaimplementować właściwość tylko do odczytu, można użyć definicji treści wyrażenia. W tym celu użyj następującej składni:
PropertyType PropertyName => expression;
W poniższym przykładzie zdefiniowano klasę Location
, której właściwość tylko Name
do odczytu jest implementowana jako definicja treści wyrażenia zwracająca wartość pola prywatnego locationName
:
public class Location
{
private string locationName;
public Location(string name)
{
locationName = name;
}
public string Name => locationName;
}
Aby uzyskać więcej informacji na temat właściwości, zobacz Właściwości (Przewodnik programowania w języku C#).
Właściwości
Definicje treści wyrażeń umożliwiają implementowanie właściwości get
i set
metod dostępu. W poniższym przykładzie pokazano, jak to zrobić:
public class Location
{
private string locationName;
public Location(string name) => Name = name;
public string Name
{
get => locationName;
set => locationName = value;
}
}
Aby uzyskać więcej informacji na temat właściwości, zobacz Właściwości (Przewodnik programowania w języku C#).
Zdarzenia
Podobnie zdarzenia add
i remove
metody dostępu mogą być wyrażeń ciała:
public class ChangedEventArgs : EventArgs
{
public required int NewValue { get; init; }
}
public class ObservableNum(int _value)
{
public event EventHandler<ChangedEventArgs> ChangedGeneric = default!;
public event EventHandler Changed
{
// Note that, while this is syntactically valid, it won't work as expected because it's creating a new delegate object with each call.
add => ChangedGeneric += (sender, args) => value(sender, args);
remove => ChangedGeneric -= (sender, args) => value(sender, args);
}
public int Value
{
get => _value;
set => ChangedGeneric?.Invoke(this, new() { NewValue = (_value = value) });
}
}
Aby uzyskać więcej informacji na temat zdarzeń, zobacz Zdarzenia (Przewodnik programowania w języku C#).
Konstruktory
Definicja treści wyrażenia dla konstruktora zwykle składa się z pojedynczego wyrażenia przypisania lub wywołania metody, które obsługuje argumenty konstruktora lub inicjuje stan wystąpienia.
W poniższym przykładzie zdefiniowano klasęLocation
, której konstruktor ma jeden parametr ciągu o nazwie name. Definicja treści wyrażenia przypisuje argument do Name
właściwości .
public class Location
{
private string locationName;
public Location(string name) => Name = name;
public string Name
{
get => locationName;
set => locationName = value;
}
}
Aby uzyskać więcej informacji, zobacz Konstruktory (Przewodnik programowania w języku C#).
Finalizatory
Definicja treści wyrażenia dla finalizatora zwykle zawiera instrukcje oczyszczania, takie jak instrukcje zwalniające niezarządzane zasoby.
W poniższym przykładzie zdefiniowano finalizator, który używa definicji treści wyrażenia, aby wskazać, że finalizator został wywołany.
public class Destroyer
{
public override string ToString() => GetType().Name;
~Destroyer() => Console.WriteLine($"The {ToString()} finalizer is executing.");
}
Aby uzyskać więcej informacji, zobacz Finalizers (Przewodnik programowania w języku C#).
Indexers (Indeksatory)
Podobnie jak w przypadku właściwości, indeksator get
i set
metody dostępu składają się z definicji treści wyrażenia, jeśli get
akcesor składa się z pojedynczego wyrażenia zwracającego wartość lub set
akcesor wykonuje proste przypisanie.
W poniższym przykładzie zdefiniowano klasę o nazwie Sports
, która zawiera tablicę wewnętrzną String zawierającą nazwy niektórych dyscyplin sportowych. Zarówno indeksator get
, jak i set
metody dostępu są implementowane jako definicje treści wyrażeń.
using System;
using System.Collections.Generic;
namespace SportsExample;
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;
}
}
Aby uzyskać więcej informacji, zobacz Indeksatory (Przewodnik programowania w języku C#).