Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 Person
metodę ToString 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#).