2016-04-02 12 views
17

w C# 6.0 można napisać:Lambda dla getter i setter własności

public int Prop => 777; 

Ale chcę użyć getter i setter. Czy istnieje sposób na zrobienie czegoś w rodzaju następnego?

public int Prop { 
    get => propVar; 
    set => propVar = value; 
} 
+2

Nie, tylko pobierające ... –

+0

Jaki problem należy próbuje rozwiązać tutaj? Ma to sens tylko dla mnie, jeśli nie dodasz bardziej skomplikowanej logiki niż po prostu ładowanie/przechowywanie wartości z/do pola, w którym to momencie automatycznie implementowane właściwości będą już pokrywać twoje potrzeby. Jakiego rodzaju implementacji masz na myśli, że jest tak krótki, że składnia '=>' jest tego warta, ale jest zbyt skomplikowana dla właściwości automatycznie implementowanych? – hvd

+1

Dlaczego nie używasz właściwości automatycznej? – slugster

Odpowiedz

30

Po pierwsze, to nie jest lambda, chociaż składnia jest podobna. To jest "expression-bodied members". Są podobne do lambd, ale wciąż są zasadniczo różne. Oczywiście nie mogą przechwytywać zmiennych lokalnych, takich jak lambdas. Ponadto, w przeciwieństwie do lambdas, są dostępne przez ich nazwę :) Prawdopodobnie zrozumiesz to lepiej, jeśli spróbujesz przekazać właściwość o charakterze ekspresowym jako delegat.

Nie ma takiej składni dla ustawiaczy w C# 6.0, ale C# 7.0 introduces it.

private int _x; 
public X 
{ 
    get => _x; 
    set => _x = value; 
} 
+1

Dlaczego nie jest lambda? – wishmaster35

+4

@ wishmaster35 Nazywa się "członkami ciała". Są podobne do lambd, ale wciąż są zasadniczo różne. Oczywiście nie mogą przechwytywać zmiennych lokalnych, takich jak lambdas. Ponadto, w przeciwieństwie do lambdas, są dostępne przez ich nazwę :) Prawdopodobnie zrozumiesz to lepiej, jeśli spróbujesz przekazać właściwość o charakterze ekspresowym jako delegat. –

2

Jest taka składnia nie, ale starsza składnia jest bardzo podobna:

private int propVar; 
    public int Prop 
    { 
     get { return propVar; } 
     set { propVar = value; } 
    } 

Albo

public int Prop { get; set; } 
19

C# 7 przynosi wsparcie dla ustawiaczy, wśród innych członków:

Więcej wyrazów członków ciała

Metody wyrażania treści, właściwości itp. Są wielkim hitem w C# 6.0, , ale nie zezwoliliśmy na nie we wszystkich rodzajach członków. C# 7.0 dodaje dostępowych, konstruktorów i finalizatory do listy rzeczy, które mogą mają ciał wyrażenie:

class Person 
{ 
    private static ConcurrentDictionary<int, string> names = new ConcurrentDictionary<int, string>(); 
    private int id = GetId(); 

    public Person(string name) => names.TryAdd(id, name); // constructors 
    ~Person() => names.TryRemove(id, out *);    // destructors 
    public string Name 
    { 
     get => names[id];         // getters 
     set => names[id] = value;       // setters 
    } 
} 
Powiązane problemy