什么是这个奇怪的C#语法,我该如何构建它?

kua*_*ang 32 c# syntax c#-6.0

在阅读项目时,我发现了一些奇怪的C#代码:

public class F : IElement
{
    public int CurrentHp { get; } = 10;
    public bool IsDead => CurrentHp <= 0;
}
Run Code Online (Sandbox Code Playgroud)

通常我会写一些类似的东西:

public class F : IElement
{
    public const int CurrentHp = 10;
    public bool IsDead
    {
        get { return CurrentHp <= 0; }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的Visual Studio 2013也无法识别第一个示例.

这个语法是什么,我该怎么做才能使这个项目可构建?

Ste*_*eve 34

=>是C#6中的新运算符,表示用于该getter 的Expression Bodied函数.

就编译器而言,您的两个示例是同义词,只返回指定的值.这=>是一种语法糖,使开发更容易,并且需要更少的代码行来实现相同的结果.

但是,除非使用最新的编译器版本更新到VS2015,否则将无法编译.

编辑:

正如Philip Kendall和Carl Leth在评论中所说的那样,每个中的第一行并不完全是同义词,因为它public const int CurrentHp = 10;是一个字段并且public int CurrentHp { get; } = 10;是属性.虽然在较高的水平的结果是相同的(分配的值10,以CurrentHp与属性仅是在类的构造可凝固)时,它们的不同点在于:

随着const int CurrentHp = 10,CurrentHp将永远是10,占用4个字节总数,并且可以静态地进行访问.int CurrentHp { get; } = 10默认为10,但可以在构造函数中更改F,因此每个实例可以不同,并且不能静态访问.

  • 我不认为这两个例子是等价的,因为`CurrentHp`是C#6版本中的属性,但是旧版本中的字段. (4认同)

Kir*_*ill 23

它是C#6的特性:C#6中的 新语言特性.

首先

public int CurrentHp { get; } = 10;
Run Code Online (Sandbox Code Playgroud)

Getter唯一的自动财产.

第二

public bool IsDead => CurrentHp <= 0;
Run Code Online (Sandbox Code Playgroud)

类似属性的函数成员上的表达式主体.


aio*_*sov 7

正如其他人所说,它是新的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; }
}
Run Code Online (Sandbox Code Playgroud)

C#6中的新语言特性