Členové s body výrazu (průvodce programováním v C#)

Definice textu výrazu umožňují poskytnout implementaci člena ve stručné a čitelné podobě. Definici těla výrazu můžete použít vždy, když logika pro libovolný podporovaný člen, jako je metoda nebo vlastnost, se skládá z jednoho výrazu. Definice těla výrazu má následující obecnou syntaxi:

member => expression;

where výraz je platný výraz.

Definice těla výrazu lze použít s následujícími členy typu:

Metody

Výrazem bodied metoda 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řepisovat ToString metodu obvykle obsahují jeden výraz, který vrací řetězcovou reprezentaci aktuálního objektu.

Následující příklad definuje Person třídu, která přepíše metodu ToString definicí těla výrazu. Definuje také metodu DisplayName , která zobrazí název konzoly. Klíčové return slovo se nepoužívá v definici těla výrazu 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();
   }
}

Další informace najdete v tématu Metody (Průvodce programováním v C#).

Vlastnosti jen pro čtení

Definici těla výrazu můžete použít 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 Name pro čtení je implementována jako definice těla výrazu, která vrací hodnotu privátní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 Vlastnosti (Průvodce programováním v C#).

Vlastnosti

Definice těla výrazu můžete použít 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 Vlastnosti (Průvodce programováním v C#).

Události

Podobně mohou být události add a remove přístupové objekty označeny výrazem:

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

Další informace o událostech naleznete v tématu Události (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 Location třídu, jejíž konstruktor má jeden řetězcový parametr s názvem name. Definice těla výrazu přiřadí argument vlastnosti Name .

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 finalizátor obvykle obsahuje příkazy čištění, jako jsou příkazy, které vydávají nespravované prostředky.

Následující příklad definuje finalizátor, který používá definici těla výrazu k označení, že finalizátor byl volána.

public class Destroyer
{
   public override string ToString() => GetType().Name;

   ~Destroyer() => Console.WriteLine($"The {ToString()} finalizer is executing.");
}

Další informace naleznete v tématu Finalizers (Průvodce programováním v C#).

Indexery

Podobně jako u vlastností se indexer get a set přístupové objekty skládají z definic těla výrazu, pokud get se příslušenství skládá z jednoho výrazu, který vrací hodnotu nebo set přistupovací 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 některých sportů. Indexer get i set přístupové objekty se implementují jako definice těla výrazu.

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

Další informace najdete v tématu Indexery (Průvodce programováním v C#).

Viz také