プロジェクトを読んでいるときに、奇妙なC#コードを見つけました。
public class F : IElement
{
public int CurrentHp { get; } = 10;
public bool IsDead => CurrentHp <= 0;
}
通常、私は次のように書きます。
public class F : IElement
{
public const int CurrentHp = 10;
public bool IsDead
{
get { return CurrentHp <= 0; }
}
}
私の Visual Studio 201 も最初の例を認識できません。
この構文とは何ですか?このプロジェクトをビルド可能にするにはどうすればよいですか?
=>
はC#6の新しい演算子であり、そのゲッターに使用する Expression Bodied Function を示します。
2つの例は、コンパイラに関する限り同義であり、割り当てられた値を返すだけです。 =>
はシンタックスシュガーであり、開発を少し簡単にし、同じ結果を達成するために必要なコード行を少なくします。
ただし、最新のコンパイラバージョンでVS2015に更新しない限り、コンパイルすることはできません。
編集:
コメントでPhilipKendallとCarlLethが述べたように、public const int CurrentHp = 10;
はフィールドであり、public int CurrentHp { get; } = 10;
はプロパティであるため、それぞれの最初の行は正確に同義ではありません。大まかに言えば、結果は同じですが(10
の値をCurrentHp
に割り当て、プロパティはクラスコンストラクターでのみ設定可能です)、次の点で異なります。
const int CurrentHp = 10
を使用すると、CurrentHp
は常に10
になり、合計4バイトを使用し、静的にアクセスできます。int CurrentHp { get; } = 10
defaultsは10
ですが、F
のコンストラクターで変更できるため、インスタンスごとに異なる可能性があり、静的にアクセスすることはできません。
これはC#6の機能です: C#6の新しい言語機能 。
最初
public int CurrentHp { get; } = 10;
は Getter-only auto-propertiey です。
二番目
public bool IsDead => CurrentHp <= 0;
他の人が言ったように、それは新しいC#6の機能です。 1 で完全なリストを確認してください
ただし、より正確には、これはC#6より前のこれに変換されます。
public class F : IElement
{
public int CurrentHp { get; private set };
public bool IsDead { get { return CurrentHp <= 0; } }
public F() { CurrentHp = 10; }
}
これは、C#6を使用する場合のコードです。
public bool IsDead => CurrentHp <= 0;
この演算子=>
を使用する場合、これはget
を持つ単なるプロパティです。
以前のバージョンでは、次のように記述します。
public bool IsDead { get { return CurrentHp <= 0; } }