自动属性初始化与构造函数初始化哪个优先?

map*_*ale 0 c# c#-6.0

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

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

    public Guid customerID { get; set; } = Guid.NewGuid();
}
Run Code Online (Sandbox Code Playgroud)

...因为,我知道当我的开发团队转向C#6.0时会发生这种情况.哪个优先/被使用(构造函数NewGuid()或属性NewGuid())以及为什么?什么时候我们应该使用一个与另一个作​​为最佳实践?

Evk*_*Evk 5

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

private Guid _customerID = Guid.NewGuid();
public Guid customerID
{
    get { return _customerID; }
    set { _customerID = value; }
}
Run Code Online (Sandbox Code Playgroud)

所以实际的问题是:首先运行什么,字段初始化器或构造函数.答案很长一段时间 - 首先运行字段初始化程序,然后运行构造函数.因此,在构造函数中编写的值将覆盖示例中字段初始值设定项的值.


Xia*_*312 5

看起来自动属性初始值设定项将首先被调用,然后是构造函数。

我用 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");
}
Run Code Online (Sandbox Code Playgroud)

并且,结果如下:

在此输入图像描述


Mic*_*han 2

它看起来像自动属性然后构造函数。运行此命令显示 1 作为我假设构造函数覆盖初始值的值。

public class Customer
{
    public Customer()
        {
            customerID = 1;
        }
    public int customerID { get; set; } = 2;
}
Run Code Online (Sandbox Code Playgroud)