【问题标题】:How can I break inside an C# automatic constructor block?如何打破 C# 自动构造函数块?
【发布时间】:2012-02-17 11:04:26
【问题描述】:

我想知道是否有任何方法可以在自动构造函数/对象初始化程序块中放置断点?

例子:

var x = new Person()
{
  Name = 'John',
  Age = DateTime.Now - Birthdate
}

我想在第 4 行放置断点。当为每个属性设置 150 个具有不同逻辑的字段并且您创建实例的类型不受您控制(例如 EF4 实体)时,这非常有用,因此您无法创建自定义构造函数。有什么想法吗?

【问题讨论】:

  • Nitpick - 这被称为对象初始化器。需要注意的是,这些属性没有在构建时设置。它们在施工后立即设置。这只是创建实例的语法糖(使用上面示例中的默认构造函数),然后立即分配属性。
  • Nitpickier :) - 不同之处在于:使用对象初始化器,在表面下创建一个临时对象,在设置所有属性后将其复制到可见对象(人)。不同之处在于,永远不会有一个人对象处于未定义状态。
  • 如果某些答案符合您的需要,您可以将其标记为最终答案:) 它可以帮助您在其他问题上获得好的答案。

标签: c# visual-studio-2010


【解决方案1】:

您可以针对此问题使用的解决方法是编写这样的代码以简化调试:

var x = new Person();
x.Name = "John";
x.Age = DateTime.Now - Birthdate;

【讨论】:

    【解决方案2】:

    将值包装在您想要在自调用函数中设置断点的行:

    var x = new Person() {
        Name = new Func<string>(() =>"John").Invoke(),
        Age = DateTime.Now - Birthdate
    };
    

    现在您将能够“步入”它。不过,它不会有太大用处,因为 x 将保持为空,直到块结束。

    【讨论】:

      【解决方案3】:

      如果Name 属性不是自动的,您可以在该属性的set 中放置一个断点。

      【讨论】:

        【解决方案4】:

        如果你这样做,那么你不能。您可以在整个块上设置断点并使用 F11 单步执行。

        你为什么不做以下事情

        Person p = new Person();
        p.Name = "John";
        p.//Blah
        

        【讨论】:

          猜你喜欢
          • 2016-02-17
          • 1970-01-01
          • 1970-01-01
          • 2012-03-08
          • 1970-01-01
          • 2015-08-30
          • 2015-09-16
          • 2013-08-04
          • 2016-12-07
          相关资源
          最近更新 更多