例如,执行以下操作:

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();
    }

09-06 18:45