Поделиться через


Члены, воплощающие выражения (руководство по программированию на C#)

Определения текста выражения позволяют предоставить реализацию члена в краткой, доступной для чтения форме. Определение тела выражения можно использовать, когда логика для любого поддерживаемого члена, такого как метод или свойство, состоит из одного выражения. Определение тела выражения имеет следующий общий синтаксис:

member => expression;

здесь expression является допустимым выражением.

Определения текста выражения можно использовать со следующими элементами типа:

Методы

Метод, воплощающий выражение, состоит из одного выражения, возвращающего значение, тип которого соответствует возвращаемому типу метода, или методов, возвращающих void, который выполняет некоторые операции. Например, типы, переопределяющие метод ToString, обычно содержат одно выражение, которое возвращает строковое представление текущего объекта.

В следующем примере определяется класс Person, который переопределяет метод ToString с помощью определения тела выражения. Он также определяет метод DisplayName, который отображает имя в консоли. Ключевое return слово не используется в определении ToString текста выражения.

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();
   }
}

Дополнительные сведения см. в разделе Методы (руководство по программированию на 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#).

События

Аналогичным образом события add и remove методы доступа могут быть выражены следующим образом:

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) });
   }
}

Дополнительные сведения о событиях см. в руководстве по программированию на 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;

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;
   }
}

Дополнительные сведения см. в разделе Индексаторы (руководство по программированию на C#).

См. также