【问题标题】:Can string formatting be used in text shown with DebuggerDisplay?可以在 DebuggerDisplay 显示的文本中使用字符串格式吗?
【发布时间】:2009-12-07 14:28:06
【问题描述】:

我想应用DebuggerDisplayAttribute 来包含内存地址值。 有没有办法让它以十六进制显示?

[DebuggerDisplay("Foo: Address value is {Address}")] 
class Foo 
{
    System.IntPtr m_Address = new System.IntPtr(43981); // Sample value


    System.IntPtr Address
    {
         get { return m_Address; }
    }
} 

这将显示:Foo: Address value is 43981 相反,我希望该值以十六进制显示,例如:Foo: Address value is 0xABCD

我知道我可以通过覆盖 ToString() 来应用各种格式,但我很好奇 DebuggerDisplayAttributes 是否也可以这样做。

提前致谢!

【问题讨论】:

    标签: c# .net visual-studio debugging


    【解决方案1】:

    是的,您可以像往常一样使用属性中的任何方法。 [DebuggerDisplay("Foo: Address value is {Address.ToString(\"<formatting>\"}")] 就是一个例子

    http://msdn.microsoft.com/en-us/library/x810d419.aspx

    【讨论】:

    • 虽然这是可能的,但我建议不要这样做。它取消了将数字显示为十六进制或十进制的选择。如果你不给它附加文本,它也会在开头和结尾加上引号,所以它最终会导致"0xDEADBEEF" 出现在调试器窗口中,起初看起来像一个字符串而不是一个整数。
    【解决方案2】:

    有一个https://blogs.msdn.microsoft.com/jaredpar/2011/03/18/debuggerdisplay-attribute-best-practices/推荐的小技巧

    基本上,创建一个私有属性,例如DebugDisplay。让属性返回您选择的格式化字符串。然后在 DebuggerDisplay 属性中使用您的新私有属性。

    例如

    [DebuggerDisplay("{DebugDisplay,nq}")]
    public sealed class Student {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        private string DebugDisplay {
            get { return string.Format("Student: {0} {1}", FirstName, LastName); }
        }
    }
    

    我发现这种方式更具可读性。

    【讨论】:

      【解决方案3】:

      如果您只想查看十六进制格式的值,Visual Studio 中有一个选项可以显示该格式的值。调试时,将鼠标悬停在您的变量上以调出调试显示,或在您的手表或本地窗口中查找变量。右键单击变量并选择“十六进制显示”选项。然后调试器将以十六进制格式显示所有数值。 在这种情况下,你会得到:“Foo: Address value is 0x0000abcd”

      不幸的是,我看不到任何方法可以真正控制 DebuggerDisplay 属性显示的字符串格式,正如您所要求的那样。

      【讨论】:

        【解决方案4】:

        来自微软自己的文档:

        https://docs.microsoft.com/en-us/visualstudio/debugger/format-specifiers-in-csharp?view=vs-2017

        您可以通过将,h 添加到表达式的评估中来以十六进制格式显示值。

        这也适用于 DebuggerDisplay 属性。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-31
          • 2023-03-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-10
          • 2021-07-18
          相关资源
          最近更新 更多