Megosztás a következőn keresztül:


Kifejezéssel testesített tagok (C# programozási útmutató)

A kifejezéstörzsdefiníciók segítségével tömör, olvasható formában adhat meg egy tag implementációját. A kifejezés törzsdefinícióját akkor használhatja, ha bármely támogatott tag logikája, például egy metódus vagy tulajdonság egyetlen kifejezésből áll. A kifejezéstörzs definíciója a következő általános szintaxist tartalmazza:

member => expression;

ahol a kifejezés érvényes kifejezés.

A kifejezés törzsdefiníciói a következő típustagokkal használhatók:

Metódusok

A kifejezés által testesített metódus egyetlen kifejezésből áll, amely egy olyan értéket ad vissza, amelynek típusa megegyezik a metódus visszatérési típusával, vagy a visszaadott voidmetódusok esetében, amelyek valamilyen műveletet hajtanak végre. A metódust felülbíráló ToString típusok például általában egyetlen kifejezést tartalmaznak, amely az aktuális objektum sztringképét adja vissza.

Az alábbi példa egy olyan osztályt Person határoz meg, amely felülírja a ToString metódust egy kifejezéstörzs-definícióval. Definiál egy metódust DisplayName is, amely megjelenít egy nevet a konzolon. A return kulcsszó nem használatos a ToString kifejezés törzsdefiníciójában.

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

További információ: Metódusok (C# programozási útmutató).

Csak olvasható tulajdonságok

A kifejezés törzsdefiníciója használható írásvédett tulajdonság implementálásához. Ehhez használja a következő szintaxist:

PropertyType PropertyName => expression;

Az alábbi példa egy olyan osztályt Location határoz meg, amelynek írásvédett Name tulajdonsága kifejezéstörzsdefinícióként van implementálva, amely a magánmező locationName értékét adja vissza:

public class Location
{
   private string locationName;

   public Location(string name)
   {
      locationName = name;
   }

   public string Name => locationName;
}

A tulajdonságokról további információt a Tulajdonságok (C# programozási útmutató) című témakörben talál.

Tulajdonságok

A kifejezéstörzs-definíciókkal tulajdonságokat get és set tartozékokat implementálhat. Az alábbi példa bemutatja, hogyan teheti ezt meg:

public class Location
{
   private string locationName;

   public Location(string name) => Name = name;

   public string Name
   {
      get => locationName;
      set => locationName = value;
   }
}

A tulajdonságokról további információt a Tulajdonságok (C# programozási útmutató) című témakörben talál.

esemény

Hasonlóképpen, az esemény add és remove a tartozék is kifejezés-testes:

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

Az eseményekről további információt az Események (C# programozási útmutató) című témakörben talál.

Konstruktorok

A konstruktor kifejezéstörzsének definíciója általában egyetlen hozzárendelési kifejezésből vagy metódushívásból áll, amely kezeli a konstruktor argumentumait, vagy inicializálja a példány állapotát.

Az alábbi példa egy osztályt Location határoz meg, amelynek konstruktorának neve egyetlen sztringparaméterrel rendelkezik. A kifejezés törzsdefiníciója hozzárendeli az argumentumot a Name tulajdonsághoz.

public class Location
{
   private string locationName;

   public Location(string name) => Name = name;

   public string Name
   {
      get => locationName;
      set => locationName = value;
   }
}

További információ: Konstruktorok (C# programozási útmutató).

Döntősök

A véglegesítő kifejezés törzsdefiníciója általában karbantartási utasításokat tartalmaz, például a nem felügyelt erőforrásokat felszabadító utasításokat.

Az alábbi példa egy véglegesítőt határoz meg, amely egy kifejezés törzsdefinícióját használja annak jelzésére, hogy a véglegesítő meghívása megtörtént.

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

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

További információ: Finalizers (C# programozási útmutató).

Indexelők

A tulajdonságokhoz hasonlóan az indexelő get és set a tartozék kifejezéstörzs-definíciókból áll, ha a get tartozék egyetlen olyan kifejezésből áll, amely egy értéket ad vissza, vagy a set tartozék egyszerű hozzárendelést hajt végre.

Az alábbi példa egy olyan osztályt Sports határoz meg, amely egy belső String tömböt tartalmaz, amely bizonyos sportágak nevét tartalmazza. Az indexelő get és set a tartozék kifejezéstörzs-definícióként is implementálva van.

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

További információ: Indexelők (C# programozási útmutató).

Lásd még