2017-04-13 61 views
1

今天早上我在构建的应用程序中遇到了一个有趣的情况。尽管我以另一种方式解决了这个问题,但我很想知道答案是什么。使用对象初始化器时的执行顺序

假设我们有以下的情况:

public class SomeDependency 
{ 
    public string SomeThing { get; set; } 
} 

public class SomeClass 
{ 
    public SomeDependency Dependency { get; } 

    public SomeClass() : this(new SomeDependency) { } 

    public SomeClass(SomeDependency dependency) 
    { 
     Dependency = dependency; 
    } 
} 

现在有初始化这个类有2种方法:
我们只能说:

var x = new SomeClass(); 

当然,这将会给我们预期的情况。但是,如果我们这样做:

var x = new SomeClass 
{ 
    Dependency = new SomeDependency { SomeThing = "some random string" } 
}; 

我们使用无参数的构造函数在后者的情况,但我们确实给Dependency通过对象初始值,因此,我的问题:

Dependency由该this(new SomeDependency())被覆盖呼叫?

+0

*是否将依赖项被this(new SomeDependency())调用覆盖?*相反。首先构造函数完全运行,然后完成字段/属性初始化('Dependency =')。对象初始化程序是纯同义糖。它在* new'SomeClass'返回新对象后完成。 – xanatos

回答

1

您的代码实际上是由编译器转换成这样:

var x = new SomeClass(); 
x.Dependency = new SomeDependency { SomeThing = "some random string" }; 

所以,不,构造不会覆盖你Dependency设置的值。相反,它会更改第二行构造函数中的默认值。

+0

谢谢,很高兴知道! –