声明 C# 属性

Declaring C# properties

我曾经按如下方式设置 C# class 成员:

public class MyClass
{
    private string member1;

    public string Member1{ get; set; }
}

使用 Visual Studio 2017 和 .NET Framework 4.6.1,当我按照 VS2017 的建议重构我的代码时,相同的代码工作得很好,但看起来像这样:

public class MyClass
{
   private string member1;
   public string Member1 { get => member1; set => member1 = value; }
}

我想了解更多 getset 属性的变化意味着什么。

您提供的代码示例的主要区别在于,旧示例中的 member1 字段实际上并未被 Member1 属性.

修改

否则,新语法只是 getter 和 setter 的内联实现的另一种选择。

在重构方面,它只是语法糖,允许您使用表达式来定义某些东西(包括 getter and/or setter),重要的区别是它仅支持单个表达式。目标是使代码更简洁,它是 C# 6 中引入的增强功能的一部分。

考虑一下:

public string Description { get { return string.Format("{0} {1} {2}", Year, Make, Model); } }

与此对比:

public string Description => $"{Year} {Make} {Model}";

更容易阅读,不是吗?

您在此示例中看到的是 Expression-Bodied MembersString Interpolation.

正如其他人所指出的,您的原始代码根本没有使用该变量。您可以删除 private string member1; 并且代码仍会像以前一样工作。

来源:

Expression-bodied members (C# programming guide)

C# 6.0 Gets More Concise with Expression Bodied Properties, Dictionary initializer

String Interpolation in C#

属性-初始化语法是 C# 语言的一部分,因此不依赖于 .NET Framework 版本。您使用的 Visual Studio 版本确实会影响您可用的 C# 版本,但请注意,例如,可以使用编写最新 C# 版本时的版本 - 7.x - .

说完这些,让我们看一些 属性 声明。

一个传统的、沼泽标准的字段支持的 C# 属性 声明看起来像这样,尽管理想情况下具有更具描述性的命名:

public class MyClass
{
    private string member1;

    public string Member1
    {
        get { return member1; }
        set { member1 = value; }
    }
}

我们有一个 public getter,其中 returns 我们的私有支持字段 member1;和一个 public setter 来设置我们的私有支持字段。

以上代码很可能是您认为您前世使用的代码。这是您提供的代码:

public class MyClass
{
    private string member1;

    public string Member1 { get; set; }
}

...但是没有。 private string member1; 未被 Member1 属性 引用。事实上,在这个例子中,member1 根本没有被引用 并且很可能被编译器优化掉了!你真正写的是:

public class MyClass
{
    public string Member1 { get; set; }
}

以上是 C# 3.0 中引入的 auto-implemented property。请注意 getset 关键字后面没有正文。

In C# 3.0 and later, auto-implemented properties make property-declaration more concise when no additional logic is required in the property accessors... When you declare a property [this way], the compiler creates a private, anonymous backing field that can only be accessed through the property's get and set accessors.

因此,就像在我们的 "traditional, bog-standard field-backed property" 示例中一样,我们得到了一个字段支持的 属性,除了这次我们没有在代码中定义字段并且它对我们来说是匿名的。在我们信任的编译器中!

我们快完成了。让我们看看您的新代码:

public class MyClass
{
    private string member1;
    public string Member1 { get => member1; set => member1 = value; }
}

get => member1 - 这是 C# 6 中引入的 属性 get 访问器和 expression body definition。它只是等同于 get { return member1; }.[= 的语法糖30=]

set => member1 = value; 是具有表达式主体定义的 属性 集合访问器。此语法是在 C# 7 中为 setter 引入的。它是 set { member1 = value; }.

的语法糖

为了结束这个总结,C# 6 还引入了 initializers for auto-properties。初始化程序直接初始化支持字段。考虑这个优雅的轻量级代码来声明和初始化一个简单的、(隐藏的、匿名的)字段支持的可读和可写 属性:

public string Member1 { get; set; } = "I am Member 1!"