2

オブジェクト初期化子を使用してクラスのプロパティを設定し、クラスのコンストラクター内でそれらにアクセスしようとしています。問題は、コンストラクターが実行されるまでプロパティが設定されていないように見えることです。私は何か間違ったことをしていますか?

ベーシッククラス..

public class TestClass
{
    public string FirstName{get; set;}

    public TestClass(){
       NewClass nc = NewClass(FirstName);
    }

}

クライアントクラス

public class ClientClass
{
   public ClientClass(){
      TestClass tc = new TestClass{ FirstName="Jimmy"};
   }
}
4

4 に答える 4

10

オブジェクトイニシャライザーは実際には構文糖衣です。与えられた:

var person = new Person() { Name = "Matt" };

コンパイラはこれを次のように変更します。

Person person = new Person();
person.Name = "Matt";

(まあ、実際にはそのILバリアント)

コンストラクターは、常にプロパティセットの前に実行されます。コンストラクターを作成するときは、型を正しく初期化するためにパラメーターを渡す必要があることが非常に重要です。あなたの例では、FirstNameが必要なので、それをコンストラクターパラメーターとして渡してみませんか?

public TestClass(string firstName) { }
于 2010-07-01T12:37:42.600 に答える
1
TestClass tc = new TestClass { FirstName = "Jimmy" };

のシンタックスシュガーです

TestClass tc = new TestClass();

tc.FirstName = "Jimmy";

したがって、期待される結果は観察したものです。プロパティは、コンストラクターの実行後に割り当てられます。

オブジェクトの不変条件はコンストラクターによって確立され、オブジェクトの存続期間中に違反されないようにする必要があります(または、より実際的な不変条件の違反は短命であり、外部からは見えないようにする必要があります)。したがって、オブジェクトの不変条件を確立するために重要な場合は、コンストラクターパラメーターとして名を渡す必要があります。

私の意見では、フィールド初期化子はひどく酷使されています。呼び出し元にコンストラクター引数を提供するように強制することはできますが、新しいインスタンスを作成した後に一部のプロパティを設定することはできないことに常に注意してください。

于 2010-07-01T12:38:35.173 に答える
0

いいえ、何も悪いことはしていません。これが、オブジェクト初期化子の動作方法です。オブジェクトへの参照を取得するために最初にコンストラクターを呼び出し、プロパティを設定した後にのみ呼び出します。単なる構文糖衣です。

于 2010-07-01T12:37:31.243 に答える
0

他の答えが言ったように。コンストラクターを使用してFirstNameを設定することもできます。

public TestClass(string firstName){
   FirstName = firstName;
   NewClass nc = NewClass(FirstName);
}
于 2010-07-01T12:42:04.833 に答える