如何在使用对象初始化程序时正确使用断点?
例如,做这样的事情:
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;
因为整个块都是这样翻译的,所以你不能一步到位。 如果你绝对需要打破一个特定的步骤,你有几个选择。
-
分开来。 调试时不要使用对象初始值设定项,并且可以将它们放回到后面。
-
临时变量。 而不是直接分配
Id = row.Field
,首先将("Id") row.Field
分配给临时变量(或者您要调试的任何一个),然后分配临时变量到对象初始值设定项属性。("Id") -
方法调用。 您可以在自定义方法调用中包含一些代码,仅允许您在自定义方法中添加断点。 你甚至可以像这样概括它:
Id = BreakThenDoSomething(() => row.Field("Id")); public static T BreakThenDoSomething(Func f) { Debugger.Break(); return f(); }