Uttrycksbaserade medlemmar (programmeringsguide för C#)
Med uttryckstextdefinitioner kan du tillhandahålla en medlems implementering i ett kortfattat, läsbart formulär. Du kan använda en uttryckstextdefinition när logiken för alla medlemmar som stöds, till exempel en metod eller egenskap, består av ett enda uttryck. En uttryckstextdefinition har följande allmänna syntax:
member => expression;
där uttrycket är ett giltigt uttryck.
Uttryckstextdefinitioner kan användas med följande typmedlemmar:
Metoder
En uttrycksmetod består av ett enda uttryck som returnerar ett värde vars typ matchar metodens returtyp, eller, för metoder som returnerar void
, som utför en åtgärd. Typer som åsidosätter ToString metoden innehåller till exempel vanligtvis ett enda uttryck som returnerar strängrepresentationen av det aktuella objektet.
I följande exempel definieras en Person
klass som åsidosätter ToString metoden med en uttryckstextdefinition. Den definierar också en DisplayName
metod som visar ett namn för konsolen. Nyckelordet return
används inte i uttryckstextdefinitionen 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();
}
}
Mer information finns i Metoder (C#-programmeringsguide).
Skrivskyddade egenskaper
Du kan använda uttryckstextdefinition för att implementera en skrivskyddad egenskap. Använd följande syntax för att göra det:
PropertyType PropertyName => expression;
I följande exempel definieras en Location
klass vars skrivskyddade Name
egenskap implementeras som en uttryckstextdefinition som returnerar värdet för det privata locationName
fältet:
public class Location
{
private string locationName;
public Location(string name)
{
locationName = name;
}
public string Name => locationName;
}
Mer information om egenskaper finns i Egenskaper (C#-programmeringsguide).
Egenskaper
Du kan använda uttryckstextdefinitioner för att implementera egenskaper get
och set
accessorer. I följande exempel visas hur du gör det:
public class Location
{
private string locationName;
public Location(string name) => Name = name;
public string Name
{
get => locationName;
set => locationName = value;
}
}
Mer information om egenskaper finns i Egenskaper (C#-programmeringsguide).
Händelser
På samma sätt kan händelse add
- och remove
accessorer vara uttrycksdrivna:
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) });
}
}
Mer information om händelser finns i Events (C# Programming Guide).
Konstruktorer
En uttryckstextdefinition för en konstruktor består vanligtvis av ett enda tilldelningsuttryck eller ett metodanrop som hanterar konstruktorns argument eller initierar instanstillståndet.
I följande exempel definieras en Location
klass vars konstruktor har en enda strängparameter med namnet name. Uttryckstextdefinitionen tilldelar argumentet till Name
egenskapen.
public class Location
{
private string locationName;
public Location(string name) => Name = name;
public string Name
{
get => locationName;
set => locationName = value;
}
}
Mer information finns i Konstruktorer (C#-programmeringsguide).
Slutförare
En uttryckstextdefinition för en finalizer innehåller vanligtvis rensningsuttryck, till exempel instruktioner som frigör ohanterade resurser.
I följande exempel definieras en finalizer som använder en uttryckstextdefinition för att indikera att finalizern har anropats.
public class Destroyer
{
public override string ToString() => GetType().Name;
~Destroyer() => Console.WriteLine($"The {ToString()} finalizer is executing.");
}
Mer information finns i Finalizers (C#Programming Guide).
Indexerare
Precis som med egenskaper består indexerare get
och set
accessorer av uttryckstextdefinitioner om get
accessorn består av ett enda uttryck som returnerar ett värde eller set
om accessorn utför en enkel tilldelning.
I följande exempel definieras en klass med namnet Sports
som innehåller en intern String matris som innehåller namnen på vissa sporter. Både indexeraren get
och set
accessorerna implementeras som uttryckstextdefinitioner.
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;
}
}
Mer information finns i Indexerare (C#-programmeringsguide).