2016-02-24 3 views
32

Wenn ein Projekt zu lesen, fand ich etwas merkwürdig C# -Code:Was ist das seltsame C# Syntax und wie baue ich es?

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

Normalerweise würde ich so etwas schreiben:

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

Mein Visual Studio 2013 auch das erste Beispiel nicht erkennen kann.

Was ist diese Syntax und was muss ich tun, um dieses Projekt zu erstellen?

+6

ich nicht const für einen dynamischen Gesundheitswert verwenden würde. – Ave

+5

'=> CurrentHp <=' ist sicherlich ein unglückliches Artefakt der Lambda/Ausdruck-Körper-Funktionssyntax. Ich würde zumindest 'IsDead => (CurrentHp <= 0)' schreiben. –

Antwort

34

=> ist ein neuer Operator in C# 6 und zeigt eine Expression Bodied Function für diesen Getter an.

Ihre beiden Beispiele sind auch soweit der Compiler betroffen ist und geben nur den zugewiesenen Wert zurück. Die => ist syntaktischen Zucker, um die Entwicklung ein wenig einfacher zu machen und benötigen weniger Zeilen Code, um das gleiche Ergebnis zu erzielen.

Sie können jedoch nicht kompilieren, wenn Sie nicht mit der neuesten Compiler-Version auf VS2015 aktualisieren.

Edit:

Wie gesagt von Philip Kendall und Carl Leth in den Kommentaren, die ersten Zeilen in jeweils nicht genau auch als public const int CurrentHp = 10; ist ein Feld, und public int CurrentHp { get; } = 10; ist eine Eigenschaft. Obwohl auf einem hohen Niveau ist das Ergebnis das gleiche (nur einen Wert von 10-CurrentHp mit der Eigenschaft in der Klasse Konstruktor ist einstellbar Zuordnung), unterscheiden sie sich dadurch, dass:

Mit const int CurrentHp = 10, CurrentHp immer 10 sein wird, nehmen insgesamt 4 Byte auf und können statisch zugegriffen werden. int CurrentHp { get; } = 10 ist standardmäßig 10, kann aber im Konstruktor F geändert werden und kann daher pro Instanz unterschiedlich sein und kann nicht statisch aufgerufen werden.

+4

Ich glaube nicht, dass die beiden Beispiele gleichwertig sind, da 'CurrentHp' eine Eigenschaft in der C# 6-Version ist, aber ein Feld in der älteren Version. –

+1

Als Beispiel für den Unterschied @PhilipKendall vermerkt, mit 'const int CurrentHp = 10', ist CurrentHp immer 10, nimmt insgesamt 4 Bytes auf und kann statisch zugegriffen werden. 'int CurrentHp {erhalten; } = 10' ist standardmäßig auf 10 gesetzt, kann aber im Konstruktor von 'F' geändert werden und kann dadurch pro Instanz unterschiedlich sein und kann nicht statisch zugegriffen werden. –

+1

Im zweiten Beispiel ist CurrentHp nicht immer immer 10, auch andere Assemblies, die es verwenden, werden es als eine Kompilierzeitkonstante behandeln und daher niemals Ihre Klasse nach diesem Wert fragen. Seien Sie sehr vorsichtig mit öffentlichen Feldern. – linac

7

Wie andere Leute sagten, es ist neue C# 6 Funktionen.Überprüfen vollständige Liste bei 1

jedoch mehr richtig dies dies in vor C# übersetzen würde 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

Dies ist der Code, wenn Sie C verwenden # 6:

public bool IsDead => CurrentHp <= 0; 

Es ist nur eine Eigenschaft mit einer get, wenn Sie diesen Operator => verwenden.

In früheren Versionen würden Sie so etwas schreiben:

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