web-dev-qa-db-ja.com

この奇妙なC#構文とは何ですか?どのように構築しますか?

プロジェクトを読んでいるときに、奇妙な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 も最初の例を認識できません。

この構文とは何ですか?このプロジェクトをビルド可能にするにはどうすればよいですか?

32
kuang

=>は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; } = 10defaultsは10ですが、Fのコンストラクターで変更できるため、インスタンスごとに異なる可能性があり、静的にアクセスすることはできません。

34
Steve

これはC#6の機能です: C#6の新しい言語機能

最初

public int CurrentHp { get; } = 10;

Getter-only auto-propertiey です。

二番目

public bool IsDead => CurrentHp <= 0;

プロパティのような関数メンバーの式本体

23
Kirill

他の人が言ったように、それは新しい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の新しい言語機能

7
aiodintsov

これは、C#6を使用する場合のコードです。

public bool IsDead => CurrentHp <= 0;

この演算子=>を使用する場合、これはgetを持つ単なるプロパティです。

以前のバージョンでは、次のように記述します。

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