假设我正在这样做......
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())以及为什么?什么时候我们应该使用一个与另一个作为最佳实践?
自动属性初始化程序基本上是语法糖:
private Guid _customerID = Guid.NewGuid();
public Guid customerID
{
get { return _customerID; }
set { _customerID = value; }
}
Run Code Online (Sandbox Code Playgroud)
所以实际的问题是:首先运行什么,字段初始化器或构造函数.答案很长一段时间 - 首先运行字段初始化程序,然后运行构造函数.因此,在构造函数中编写的值将覆盖示例中字段初始值设定项的值.
看起来自动属性初始值设定项将首先被调用,然后是构造函数。
我用 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)
并且,结果如下:
它看起来像自动属性然后构造函数。运行此命令显示 1 作为我假设构造函数覆盖初始值的值。
public class Customer
{
public Customer()
{
customerID = 1;
}
public int customerID { get; set; } = 2;
}
Run Code Online (Sandbox Code Playgroud)