C# Language Membri della funzione con espressione corporea

Esempio

I membri delle funzioni con corpo espressivo consentono l'uso di espressioni lambda come corpi membri. Per i membri semplici, può risultare in un codice più pulito e più leggibile.

Le funzioni con corpo espressivo possono essere utilizzate per proprietà, indicizzatori, metodi e operatori.


Proprietà

public decimal TotalPrice => BasePrice + Taxes;

È equivalente a:

public decimal TotalPrice
{
    get
    {
        return BasePrice + Taxes;
    }
}

Quando una funzione con un'espressione viene utilizzata con una proprietà, la proprietà viene implementata come proprietà di solo getter.

Visualizza la demo


indicizzatori

public object this[string key] => dictionary[key];

È equivalente a:

public object this[string key]
{
    get
    {
        return dictionary[key];
    }
}

metodi

static int Multiply(int a, int b) => a * b;

È equivalente a:

static int Multiply(int a, int b)
{
    return a * b;
}

Che può essere utilizzato anche con metodi void :

public void Dispose() => resource?.Dispose();

Un override di ToString potrebbe essere aggiunto alla classe Pair<T> :

public override string ToString() => $"{First}, {Second}";

Inoltre, questo approccio semplicistico funziona con la parola chiave override :

public class Foo
{
    public int Bar { get; }

    public string override ToString() => $"Bar: {Bar}";
}

operatori

Questo può anche essere utilizzato dagli operatori:

public class Land
{
    public double Area { get; set; }

    public static Land operator +(Land first, Land second) =>
        new Land { Area = first.Area + second.Area };
}

limitazioni

I membri delle funzioni con corpo di espressione hanno alcune limitazioni. Non possono contenere istruzioni di blocco e qualsiasi altra istruzione che contenga blocchi: if , switch , for , foreach , while , do , try , etc.

Alcuni if dichiarazioni possono essere sostituite con operatori ternari. Alcune istruzioni for e foreach possono essere convertite in query LINQ, ad esempio:

IEnumerable<string> Digits
{
    get
    {
        for (int i = 0; i < 10; i++)
            yield return i.ToString();
    }
}
IEnumerable<string> Digits => Enumerable.Range(0, 10).Select(i => i.ToString());

In tutti gli altri casi, è possibile utilizzare la vecchia sintassi per i membri delle funzioni.

I membri delle funzioni con corpo di espressione possono contenere async / await , ma spesso sono ridondanti:

async Task<int> Foo() => await Bar();  

Può essere sostituito con:

Task<int> Foo() => Bar();