【问题标题】:Declaring C# properties声明 C# 属性
【发布时间】:2018-04-16 18:03:28
【问题描述】:

我以前是这样设置 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 属性的变化意味着什么。

【问题讨论】:

    标签: c# .net class member


    【解决方案1】:

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

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

    传统的、沼泽标准的字段支持 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; }
    }
    

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

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

    因此,就像在我们的“传统的、沼泽标准的字段支持属性”示例中一样,我们得到了一个字段支持的属性,除了这次我们没有在代码中定义该字段并且它对我们来说是匿名的。在我们信任的编译器中!

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      就重构而言,它只是一种语法糖,允许您使用表达式来定义某些事物(包括 getter 和/或 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#

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2014-02-06
          • 2014-05-17
          • 1970-01-01
          • 2023-03-14
          • 2012-11-23
          • 2015-09-26
          • 2011-01-15
          • 1970-01-01
          • 2012-07-12
          相关资源
          最近更新 更多