声明C#属性

时间:2018-04-16 18:03:29

标签: c# .net class member

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

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属性的更改意味着什么。

3 个答案:

答案 0 :(得分:2)

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

考虑一下:

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

对此:

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

更容易阅读,不是吗?

您在此示例中看到的是表情身份成员字符串插值

正如其他人所指出的那样,您的原始代码根本没有使用该变量。您可以删除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#

答案 1 :(得分:2)

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

在此之后,让我们看一些属性声明。

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

public class MyClass
{
    private string member1;

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

我们有一个公共getter,它返回我们的私有支持字段member1;和一个公共制定者,设置我们的私人支持领域。

以上代码可能就是您在以前的生活中使用的思想。这是您提供的代码:

public class MyClass
{
    private string member1;

    public string Member1 { get; set; }
}

......但没有。 private string member1;属性未引用Member1。实际上,在此示例中,member1未在所有中引用,并且可能会被编译器优化掉!你真正写的是:

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

以上是with the not-current Visual Studio 2015,如C#3.0中所介绍的。请注意,getset关键字后面没有正文。

  

在C#3.0及更高版本中,自动实现的属性生成   当不需要额外的逻辑时,属性声明更简洁   在属性访问器中...当您以[通过这种方式]声明属性时,编译器会创建一个私有的匿名支持字段   只能通过属性的get和set访问器访问。

所以,就像我们的传统的,沼泽标准的现场支持的财产一样#34;例如,我们获得了一个字段支持的属性,除了这次我们不在代码中定义字段,它对我们来说是匿名的。在我们信任的编译器中!

我们差不多完成了。让我们看看你的新代码:

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

get => member1 - 这是一个带有auto-implemented property的属性获取访问器,如C#6中所介绍的那样。它只是等同于get { return member1; }的语法糖。

set => member1 = value;是一个带有表达式主体定义的属性集访问器。这个语法是为C#7中的setter引入的。它是set { member1 = value; }的语法糖。

为了结束本摘要,C#6还引入了expression body definition。初始化程序直接初始化后备字段。考虑这个优雅的轻量级代码来声明和初始化一个简单的(隐藏的,匿名的)字段支持的可读写属性:

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

答案 2 :(得分:0)

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

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