代码之家  ›  专栏  ›  技术社区  ›  Bjarke Ebert

类上的DebuggerDisplay

  •  13
  • Bjarke Ebert  · 技术社区  · 16 年前

    我在申请 DebuggerDisplay 泛型类的属性:

    [DebuggerDisplay("--foo--")]
    class Foo
    {
    }
    
    [DebuggerDisplay("Bar: {t}")]
    class Bar<T>
    {
        public T t;
    }
    

    检查类型的对象时 Bar<Foo> 我希望它显示为 Bar: --foo-- 但我得到 Bar: {Foo}

    我做错什么了?

    3 回复  |  直到 9 年前
        1
  •  19
  •   JaredPar    16 年前

    debuggerDisplay属性不是递归的。字符串中的基本上表示评估此表达式并以内联方式显示结果。内部结果的字符串的计算方式就像类型或成员的play中没有debuggerDisplay属性一样。这就是为什么你看到“foo”而不是“foo”。

    原因是可靠性。拥有相互递归的debuggerDisplay属性标记太容易了。这将导致在计算内部表达式时发生堆栈溢出或无限循环。不递归地计算debuggerDisplay属性可以防止这种无限递归(尽管用户仍然可以在特定表达式中自己创建它)。

    控制内部表达式显示方式的一种方法是重写.toString()方法。这将在计算内部表达式的显示字符串时进行计算。

        2
  •  2
  •   Dror Helper    9 年前

    [免责声明:我与Ozcode有关联]

    您可以使用支持嵌套/递归调试信息的Ozcode的Reveal功能。 enter image description here
    一旦为一个实例定义了它,它将自动用于该类型的所有实例。

        3
  •  1
  •   Ofir    9 年前

    你可以使用 [DebuggerDisplay("Bar<{typeof(T).Name}>,nq}")]//nq - no quotes .

    您还可以使用这些实践: DebuggerDisplay attribute best practices