2016-02-24 14 views
32

Durante la lettura di un progetto, ho trovato qualche strano codice C#:Cos'è questa strana sintassi in C# e come la costruisco?

public class F : IElement 
{ 
    public int CurrentHp { get; } = 10; 
    public bool IsDead => CurrentHp <= 0; 
} 

Normalmente avrei scritto qualcosa del tipo:

public class F : IElement 
{ 
    public const int CurrentHp = 10; 
    public bool IsDead 
    { 
     get { return CurrentHp <= 0; } 
    } 
} 

mio Visual Studio 2013 inoltre, non può riconoscere il primo esempio.

Che cos'è questa sintassi e cosa devo fare per rendere questo progetto realizzabile?

+6

Non vorrei usare const per un valore di salute dinamica. – Ave

+5

'=> CurrentHp <=' è certamente uno sfortunato artefatto della sintassi della funzione lambda/espressione-corpo. Scriverò almeno 'IsDead => (CurrentHp <= 0)'. –

risposta

34

=> è un nuovo operatore in C# 6 e indica un Expression Bodied Function da utilizzare per quel getter.

I vostri due esempi sono sinonimi per quanto riguarda il compilatore e restituiscono semplicemente il valore assegnato. Lo => è zucchero sintattico per semplificare lo sviluppo e richiedere meno righe di codice per ottenere lo stesso risultato.

Tuttavia, non sarà possibile compilare a meno che non si aggiorni a VS2015 con l'ultima versione del compilatore.

Edit:

Come detto da Philip Kendall e Carl Leth nei commenti, le prime linee in ogni non sono esattamente sinonimo come public const int CurrentHp = 10; è un campo e public int CurrentHp { get; } = 10; è una proprietà. Sebbene ad un livello elevato, il risultato è lo stesso (assegnando un valore di 10 a CurrentHp con struttura solo essere impostabile nel costruttore della classe), si differenziano dal fatto che:

Con const int CurrentHp = 10, CurrentHp sarà sempre 10, occupano 4 byte totali e sono accessibili in modo statico. int CurrentHp { get; } = 10 predefinito su 10, ma può essere modificato nel costruttore di F e quindi può essere diverso per istanza e non è possibile accedere staticamente.

+4

Non penso che i due esempi siano equivalenti come 'CurrentHp' è una proprietà nella versione C# 6 ma un campo nella versione precedente. –

+1

Come esempio della differenza osservata da @PhilipKendall, con 'const int CurrentHp = 10', CurrentHp sarà sempre 10, occuperà 4 byte totali e sarà accessibile in modo statico. 'int CurrentHp {get; } = 10' è impostato su 10, ma può essere modificato nel costruttore di 'F' e quindi può essere diverso per istanza e non può essere accesso staticamente. –

+1

Nel secondo esempio CurrentHp non sarà sempre solo 10, anche gli altri assembly che lo utilizzano, lo tratteranno come una costante di tempo di compilazione e quindi non chiederanno mai mai alla classe questo valore, mai. Stai molto attento con i campi const pubblici. – linac

7

Come altre persone hanno detto che sono nuove funzionalità C# 6.Controllare lista completa a 1

Tuttavia, più correttamente questo si tradurrebbe a questo prima di C# 6:

public class F : IElement 
{ 
    public int CurrentHp { get; private set }; 
    public bool IsDead { get { return CurrentHp <= 0; } } 
    public F() { CurrentHp = 10; } 
} 

New Language Features in C# 6

1

Questo è il tuo codice, se si utilizza C# 6:

public bool IsDead => CurrentHp <= 0; 

È solo una proprietà con get, se si utilizza questo operatore =>.

Nelle versioni precedenti si può scrivere qualcosa di simile:

public bool IsDead { get { return CurrentHp <= 0; } } 
Problemi correlati