如何在使用对象初始化程序时正确使用断点?

例如,做这样的事情:

foreach (DataRow row in data.Rows) { Person newPerson = new Person() { Id = row.Field("Id"), Name = row.Field("Name"), LastName = row.Field("LastName"), DateOfBirth = row.Field("DateOfBirth") }; people.Add(newPerson); } 

无法将断点设置为单个分配,断点将设置为整个块。

如果我想具体查看代码中断的地方,我必须使用:

  foreach (DataRow row in data.Rows) { Person newPerson = new Person(); newPerson.Id = row.Field("Id"); newPerson.Name = row.Field("Name"); newPerson.LastName = row.Field("LastName"); newPerson.DateOfBirth = row.Field("DateOfBirth"); people.Add(newPerson); } 

或者也许我错过了什么。 使用对象初始化程序时可以正确调试吗?

对象初始化器只是语法糖,在编译时会被翻译。 您的原始对象初始值设定项如下所示:

 var temp = new Person(); temp.Id = row.Field("Id"); temp.Name = row.Field("Name"); temp.LastName = row.Field("LastName"); temp.DateOfBirth = row.Field("DateOfBirth"); var person = temp; 

因为整个块都是这样翻译的,所以你不能一步到位。 如果你绝对需要打破一个特定的步骤,你有几个选择。

  1. 分开来。 调试时不要使用对象初始值设定项,并且可以将它们放回到后面。

  2. 临时变量。 而不是直接分配Id = row.Field("Id") ,首先将row.Field("Id")分配给临时变量(或者您要调试的任何一个),然后分配临时变量到对象初始值设定项属性。

  3. 方法调用。 您可以在自定义方法调用中包含一些代码,仅允许您在自定义方法中添加断点。 你甚至可以像这样概括它:

  Id = BreakThenDoSomething(() => row.Field("Id")); public static T BreakThenDoSomething(Func f) { Debugger.Break(); return f(); }