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. Emellett számos olyan metódust is tartalmaz, amelyek paramétereket vesznek fel, és bemutatják, hogyan működnek a kifejezés által testesített tagok a metódusparaméterekkel. A return kulcsszó egyik kifejezéstörzs-definícióban sem használatos.

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());
   
   // Expression-bodied methods with parameters
   public string GetFullName(string title) => $"{title} {fname} {lname}";
   public int CalculateAge(int birthYear) => DateTime.Now.Year - birthYear;
   public bool IsOlderThan(int age) => CalculateAge(1990) > age;
   public string FormatName(string format) => format.Replace("{first}", fname).Replace("{last}", lname);
}

class Example
{
   public static void Main()
   {
      Person p = new Person("Mandy", "Dejesus");
      Console.WriteLine(p);
      p.DisplayName();
      
      // Examples with parameters
      Console.WriteLine(p.GetFullName("Dr."));
      Console.WriteLine($"Age: {p.CalculateAge(1990)}");
      Console.WriteLine($"Is older than 25: {p.IsOlderThan(25)}");
      Console.WriteLine(p.FormatName("Last: {last}, First: {first}"));
   }
}

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

// Example with multiple parameters
public class Point
{
   public double X { get; }
   public double Y { get; }
   
   // Constructor with multiple parameters
   public Point(double x, double y) => (X, Y) = (x, y);
   
   // Constructor with single parameter (creates point at origin on axis)
   public Point(double coordinate) => (X, Y) = (coordinate, 0);
}

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. A példa egy Point több paramétert használó konstruktorokat tartalmazó osztályt is bemutat, amely bemutatja, hogyan működnek a kifejezés által testesített konstruktorok különböző paraméterkombinációkkal.

public class Location
{
   private string locationName;

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

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

// Example with multiple parameters
public class Point
{
   public double X { get; }
   public double Y { get; }
   
   // Constructor with multiple parameters
   public Point(double x, double y) => (X, Y) = (x, y);
   
   // Constructor with single parameter (creates point at origin on axis)
   public Point(double coordinate) => (X, Y) = (coordinate, 0);
}

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