debuggerdisplay不会按预期显示字段值

时间:2017-11-25 17:58:51

标签: c# visual-studio-2015 visual-studio-2017 field debuggerdisplay

public class A
{
    [DebuggerDisplay("{DDBpp1()}")]
    public byte[] Bpp = new byte[2];

    public string DDBpp1()
    {
        return "DDBpp";
    }

    public string DDBpp2()
    {
        short result;

        if (BitConverter.IsLittleEndian)
        {
            var bppCopy = new byte[2];
            Bpp.CopyTo(bppCopy, 0);
            Array.Reverse(bppCopy);
            result = BitConverter.ToInt16(bppCopy, 0);
        }
        else
        {
            result = BitConverter.ToInt16(Bpp, 0);
        }

        return result.ToString();
    }
}

我在DebuggerDisplay属性(DDBpp1或DDBpp2)中使用哪种方法并不重要。调试器下的值列始终由{byte [2]}填充。我期待字符串" DDBpp"对于DDBpp1()方法或DDBpp2()方法的短值。 该问题出现在VS15 / 17社区下。

是否可以更改调试器下的显示字段值?

2 个答案:

答案 0 :(得分:3)

你检查过:

  

"如果在变量窗口中显示对象的原始结构复选框   在“工具选项”对话框中选择,然后在“调试器显示”中选择   属性被忽略"

答案 1 :(得分:2)

如果你将[DebuggerDisplay("{DDBpp2()}")]放在类本身上,它将在调试器中显示bytes[]移位的int16内容 - 对于类:

DebuggerDisplayAttribute on class

如果您将Bpp实现为成员或属性,并且为其提供更多属性也无济于事。

    [DebuggerDisplay("{DDBpp2()}", Name = "{DDBpp2()}", TargetTypeName = "{DDBpp2()}", Type = "{DDBpp2()}"]
    public byte[] Bpp { get; set; } = new byte[2];

也许把它放在课堂上可以帮助你:

[DebuggerDisplay("{CDBpp2()}")]
[DebuggerDisplay("{DDBpp2()}")]
public class A
{
    [DebuggerDisplay("{DDBpp2()}", Name = "{DDBpp2()}", TargetTypeName = "{DDBpp2()}", Type = "{DDBpp2()}")]
    public byte[] Bpp { get; set; } = new byte[2] { 255, 255 };

    public byte[] Cpp { get; set; } = new byte[2] { 11, 28 };

    public string CDBpp2() => ToDebugStr(Cpp);

    public string DDBpp2() => ToDebugStr(Bpp);

    string ToDebugStr(byte[] b)
    {
        short result;
        if (BitConverter.IsLittleEndian)
        {
            var bppCopy = new byte[2];
            b.CopyTo(bppCopy, 0);
            Array.Reverse(bppCopy);
            result = BitConverter.ToInt16(bppCopy, 0);
        }
        else
        {
            result = BitConverter.ToInt16(b, 0);
        }
        return result.ToString();
    }
}

如果仔细查看msdn文档中的给定示例,您将看到该属性仅适用于类级别 - 我很难过,为什么他们没有将属性限制为类然后

我看了source of debuggerDisplayAttribute.cs - 它适用于更多的课程,你甚至可以多次使用。

  

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Delegate | AttributeTargets.Enum | AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Assembly, AllowMultiple = true)]

我的 猜测 将是VS不会在成员/属性/等上实现所有可能的结果。对于IDE,这就是为什么它不起作用。如果多次提供该属性,则只在调试器视图中使用第一个属性:请参阅我的示例并调试它。