Члены, воплощающие выражения (руководство по программированию на C#)
Определения тела выражений позволяют предоставлять реализацию члена самым быстрым и удобочитаемым способом. Определение тела выражения можно использовать, когда логика для любого поддерживаемого члена, такого как метод или свойство, состоит из одного выражения. Определение тела выражения имеет следующий общий синтаксис:
member => expression;
здесь expression является допустимым выражением.
Определения текста выражения можно использовать со следующими элементами типа:
Методы
Метод, воплощающий выражение, состоит из одного выражения, возвращающего значение, тип которого соответствует возвращаемому типу метода, или методов, возвращающих void
, который выполняет некоторые операции. Например, типы, переопределяющие метод ToString, обычно содержат одно выражение, которое возвращает строковое представление текущего объекта.
В следующем примере определяется класс Person
, который переопределяет метод ToString с помощью определения тела выражения. Он также определяет метод DisplayName
, который отображает имя в консоли. Обратите внимание, что ключевое слово return
не используется в определении тела выражения ToString
.
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();
}
}
Дополнительные сведения см. в разделе Методы (руководство по программированию на C#).
Свойства только для чтения
Определение текста выражения можно использовать для реализации свойства только для чтения. Для этого используйте следующий синтаксис:
PropertyType PropertyName => expression;
В следующем примере определяется класс Location
, свойство Name
только для чтения которого реализуется как определение тела выражения, возвращающее значение закрытого поля locationName
:
public class Location
{
private string locationName;
public Location(string name)
{
locationName = name;
}
public string Name => locationName;
}
Дополнительные сведения о свойствах см. в разделе Свойства (руководство по программированию на C#).
Свойства
Определения текста выражения можно использовать для реализации свойств get
и set
методов доступа. В следующем примере показано, как это сделать:
public class Location
{
private string locationName;
public Location(string name) => Name = name;
public string Name
{
get => locationName;
set => locationName = value;
}
}
Дополнительные сведения о свойствах см. в разделе Свойства (руководство по программированию на C#).
Конструкторы
Определение тела выражения для конструктора обычно состоит из одного выражения присваивания или вызова метода, который обрабатывает аргументы конструктора или инициализирует состояние экземпляра.
В следующем примере определяется класс Location
, конструктор которого имеет один строковый параметр name. Определение тела выражения присваивает аргумент свойству Name
.
public class Location
{
private string locationName;
public Location(string name) => Name = name;
public string Name
{
get => locationName;
set => locationName = value;
}
}
Дополнительные сведения см. в разделе Конструкторы (руководство по программированию на C#).
Методы завершения
Определение тела выражения для метода завершения обычно содержит операторы очистки, например операторы, высвобождающие неуправляемые ресурсы.
В следующем примере определяется метод завершения, который использует определение тела выражения для указания того, что был вызван метод завершения.
public class Destroyer
{
public override string ToString() => GetType().Name;
~Destroyer() => Console.WriteLine($"The {ToString()} finalizer is executing.");
}
Дополнительные сведения см. в разделе Методы завершения (руководство по программированию на C#).
Индексаторы
Как при использовании свойств, методы доступа get
и set
индексатора состоят из определений тела выражений, если метод доступа get
состоит из одного выражения, которое возвращает значение, или метод доступа set
выполняет простое присваивание.
В следующем примере определяется класс с именем Sports
, включающий внутренний массив String, который содержит названия нескольких видов спорта. Методы доступа get
и set
индексатора реализуются как определения тела выражений.
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;
}
}
Дополнительные сведения см. в разделе Индексаторы (руководство по программированию на C#).