3

例如,做这样的事情:

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

或者,也许我错过了一些东西。使用对象初始化器时可以正确调试吗?

4

1 回答 1

2

对象初始化器只是语法糖,在编译时会被翻译。你原来的对象初始化器变成了这样:

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;

由于整个块都是这样翻译的,所以您不能一步步中断。如果您绝对需要在一个特定步骤上中断,您有几个选择。

  1. 分开来。调试时不要使用对象初始化器,你可以把它们放回去。

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

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

    Id = BreakThenDoSomething(() => row.Field<int>("Id"));

    public static T BreakThenDoSomething<T>(Func<T> f)
    {
        Debugger.Break();
        return f();
    }
于 2011-02-25T02:05:21.830 回答