使用对象初始值设定项时如何正确使用断点?

问题描述 投票:0回答:2

例如,做这样的事情:

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

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

c# instance visual-studio-debugging initializer
2个回答
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(); }
    

0
投票
我于 2016 年在

https://developercommunity.visualstudio.com/t/Need-to-be-able-to-add-debugger-break-po/1109823 提出了一个问题,正在考虑中,但将会实施如果社区想要的话。

社区没有投票。看起来大多数人都可以解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.