2017-04-13 7 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にオブジェクト初期化子を経由して値を与えるので、私の質問を行います。

Dependencythis(new SomeDependency())によって上書きされますコール?

+0

*この(新しいSomeDependency())呼び出しによって依存関係が上書きされますか?*反対です。最初にコンストラクタが完全に実行された後、フィールド/プロパティの初期化が行われます( 'Dependency =')。オブジェクトの初期化子は純粋なsynctactic sugarです。 'new SomeClass'が新しいオブジェクトを返した後で*実行されます。 – xanatos

答えて

1

あなたのコードは、実際にこれにコンパイラによって変換されます

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

ありませんので、コンストラクタはあなたがDependencyに設定された値を上書きしません。代わりに、2行目のコンストラクターにデフォルト設定されている値が変更されます。

+0

おかげで、知っておいてよかった! –

関連する問題