【问题标题】:Auto-Property Initializes vs Constructor Initializes which takes precedence?自动属性初始化与构造函数初始化哪个优先?
【发布时间】:2016-05-10 20:49:48
【问题描述】:

假设我正在这样做......

public class Customer
{
    public Customer()
    {
        customerID = Guid.NewGuid();
    }

    public Guid customerID { get; set; } = Guid.NewGuid();
}

...因为,我知道随着我的开发团队迁移到 C#6.0,这将会发生。哪个将优先/被使用(构造函数 NewGuid() 或属性 NewGuid()),为什么?我们什么时候应该使用一个与另一个作​​为最佳实践?

【问题讨论】:

  • 我更喜欢构造函数方法,因为它允许重载和快速查看正在发生的事情。我工作过的大型系统都没有使用自动初始化器。
  • 您是否尝试将类型更改为非 guid 并仅运行代码?
  • 与您编写此问题的时间相比,您只需运行代码并自己找出答案。
  • 我的问题不仅仅是关于订单,还有“为什么”和最佳实践。我是否需要更长的时间来编写测试并为自己检查,这无关紧要。也许我只是想为 StackOverflow 社区增加价值,因为我自己在快速搜索中找不到这个答案?
  • 阅读here 了解一些“为什么”,尤其是评价最高的评论中的链接。唯一缺少的是自动属性初始化器扩展为Evk 发布的代码。

标签: c# c#-6.0


【解决方案1】:

自动属性初始化器基本上是语法糖:

private Guid _customerID = Guid.NewGuid();
public Guid customerID
{
    get { return _customerID; }
    set { _customerID = value; }
}

所以实际的问题是:首先运行的是字段初始化程序还是构造函数。答案早已为人所知 - 字段初始化程序首先运行,然后是构造函数。因此,在构造函数中写入的值将覆盖您示例中字段初始值设定项的值。

【讨论】:

  • 不错的观察。我只是在谷歌上搜索这个主题,但找不到任何东西。
  • 你可以通过反编译器看到它是这样工作的。
  • 我同意你的回答。我只是感到惊讶,因为互联网上没有关于自动属性初始化程序执行顺序的文章。事实证明,我忘记了它们扩展成什么。
【解决方案2】:

似乎 Auto-property 初始化程序将首先被调用,然后是构造函数。

我用 LINQPad 做了一个小演示:

void Main()
{
    new Test().Dump("result");
}

// Define other methods and classes here
class Test
{
    public int MyProperty1 { get; set; } = 1.Dump("auto-prop init");
    public Test()
    {
        MyProperty1 = 2.Dump(".ctor");
        MyProperty2 = 2.Dump(".ctor");
    }
    public int MyProperty2 { get; set; } = 1.Dump("auto-prop init");
}

结果如下:

【讨论】:

    【解决方案3】:

    它看起来像 Autoproperty 然后是构造函数。运行它会显示 1 作为我假设构造函数覆盖初始值的值。

    public class Customer
    {
        public Customer()
            {
                customerID = 1;
            }
        public int customerID { get; set; } = 2;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 2017-06-13
      • 2015-09-11
      • 1970-01-01
      相关资源
      最近更新 更多