2012-02-16 4 views
1

自動コンストラクタ/オブジェクトイニシャライザブロック内にブレークポイントを入れる方法があるのだろうか?C#の自動コンストラクタブロック内でどうやってブレークできますか?

例:

var x = new Person() 
{ 
    Name = 'John', 
    Age = DateTime.Now - Birthdate 
} 

私は4行にブレークポイントを入れたいです。これは、プロパティごとに異なるロジックを持つ150個のフィールドを設定し、インスタンスを作成するタイプが自分の管理下にない場合(たとえばEF4エンティティ)、カスタムコンストラクタを作成できない場合に非常に役立ちます。何か案は?あなたがこの問題のために使用することができます

+0

可能な複製[空白のオブジェクトイニシャライザを使用する場合、どのようにしてブレークポイントを適切に使用できますか?](http://stackoverflow.com/questions/5112782/how-can-i-properly-use-breakpoints-when-using-fancy-オブジェクト初期化子) –

+1

Nitpick - オブジェクト初期化子と呼ばれます。これらのプロパティは構築時には設定されていないことに注意することが重要です。彼らは建設の直後に設定されています。これはインスタンスを作成するための文法的な砂糖です(上の例ではデフォルトのコンストラクタを使用しています)。 –

+1

Nitpickier :) - 違いがあります:オブジェクトの初期化子では、サーフェスの下に、すべてのプロパティを設定した後に可視オブジェクト(person)にコピーされる一時オブジェクトが作成されます。違いは、定義されていない状態のpersonオブジェクトは決して存在しないということです。 –

答えて

4

回避策は、あなたのデバッグを容易にするために、このようなコードを書いている:

var x = new Person(); 
x.Name = "John"; 
x.Age = DateTime.Now - Birthdate; 
0

あなたはそれを、あなたはできませんそのようにやっている場合。ブロック全体でブレークポイントを出し、F11を使用してブレークポイントをステップ実行できます。

なぜあなたは自己呼び出し関数にブレークポイントをしたいライン上の値は、次の

Person p = new Person(); 
p.Name = "John"; 
p.//Blah 
1

ラップを行ういけない:

var x = new Person() { 
    Name = new Func<string>(() =>"John").Invoke(), 
    Age = DateTime.Now - Birthdate 
}; 

は今、あなたはへの「ステップできるようになります" それ。しかし、xがブロックの終わりまでヌルのままであるので、あまり役に立ちません。

1

Nameプロパティが自動でない場合、そのプロパティのsetの中にブレークポイントを置くことができます。