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

时间:2016-05-10 20:49:48

标签: c# c#-6.0

让我们说我这样做......

$attributes = Attribute::whereHas('types', function ($query) {
        $query->where('id', '<', '10');
    })->orderByRaw("RAND()")->limit(5)
    ->get();

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

3 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:3)

似乎第一个调用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");
}

结果如下:

enter image description here

答案 2 :(得分:1)

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

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