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

时间:2011-02-25 01:54:27

标签: c# instance visual-studio-debugging initializer

例如,做这样的事情:

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

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

1 个答案:

答案 0 :(得分: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. 方法调用。您可以在自定义方法调用中包含一些代码,仅允许您在自定义方法中添加断点。你甚至可以这样概括:

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