例如,执行以下操作:
foreach (DataRow row in data.Rows)
{
Person newPerson = new Person()
{
Id = row.Field<int>("Id"),
Name = row.Field<string>("Name"),
LastName = row.Field<string>("LastName"),
DateOfBirth = row.Field<DateTime>("DateOfBirth")
};
people.Add(newPerson);
}
不能为单个分配设置断点,而是将断点设置为整个块。
如果要查看代码中断的位置,则必须使用:
foreach (DataRow row in data.Rows)
{
Person newPerson = new Person();
newPerson.Id = row.Field<int>("Id");
newPerson.Name = row.Field<string>("Name");
newPerson.LastName = row.Field<string>("LastName");
newPerson.DateOfBirth = row.Field<DateTime>("DateOfBirth");
people.Add(newPerson);
}
也许我想念一些东西。使用对象初始化程序时可以正确调试吗?
最佳答案
对象初始化器只是语法糖,在编译时会得到翻译。您原始的对象初始值设定项将变为以下形式:
var temp = new Person();
temp.Id = row.Field<int>("Id");
temp.Name = row.Field<string>("Name");
temp.LastName = row.Field<string>("LastName");
temp.DateOfBirth = row.Field<DateTime>("DateOfBirth");
var person = temp;
由于整个块都是这样翻译的,因此您不能只一步之遥。如果您绝对需要中断某个特定步骤,则可以选择几种方法。
分开来。调试时不要使用对象初始化器,您可以将它们放回后缀。
临时变量。与其直接分配
Id = row.Field<int>("Id")
,不如直接将row.Field<int>("Id")
分配给一个临时变量(或您要调试的任何一个),然后将temp变量分配给对象初始值设定项属性。方法调用。您可以将某些代码包装在自定义方法调用中,仅允许您在自定义方法内添加断点。您甚至可以将其概括如下:
Id = BreakThenDoSomething(() => row.Field<int>("Id"));
public static T BreakThenDoSomething<T>(Func<T> f)
{
Debugger.Break();
return f();
}