【问题标题】:Order of execution when using object initializers [duplicate]使用对象初始化器时的执行顺序[重复]
【发布时间】:2017-04-13 07:28:39
【问题描述】:

今天早上,我在正在构建的应用程序中遇到了一个有趣的情况。尽管我已经以另一种方式解决了这个问题,但我有兴趣找出答案。

假设我们有以下情况:

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;
    }
}

目前有两种初始化此类的方法:
我们只能说:

var x = new SomeClass();

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

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

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

Dependency 会被this(new SomeDependency()) 调用覆盖吗?

【问题讨论】:

  • 依赖会被 this(new SomeDependency()) 调用覆盖吗? 相反。首先构造函数完全运行,然后字段/属性初始化完成 (Dependency = )。对象初始化器是纯语法糖。它在 new SomeClass 返回新对象之后完成。

标签: c# initialization


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-06-30
    • 2013-06-27
    • 1970-01-01
    • 2015-12-03
    • 2013-11-12
    • 2017-06-20
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多