簡體   English   中英

debuggerdisplay不會按預期顯示字段值

[英]debuggerdisplay doesn't display field value as expected

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]}填充。 我期望DDBpp1()方法使用字符串“ DDBpp”,或DDBpp2()方法使用較短的值。 該問題出現在VS15 / 17社區下。

是否可以在調試器中更改顯示字段值?

您是否檢查過:

“如果在“工具選項”對話框中選中“在變量窗口中顯示對象的原始結構復選框”,則將忽略DebuggerDisplay屬性。”

如果將[DebuggerDisplay("{DDBpp2()}")]放在類本身上,它將在調試器中顯示由bytes[]移位的int16內容-對於該類:

類上的DebuggerDisplayAttribute

如果將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文檔中給定的示例,您將看到該屬性只應用於類級別-但是我很困惑,為什么他們當時不將該屬性限制為類。

我看了一下debuggerDisplayAttribute.cs來源 -它適用於更多的類,甚至可以多次使用。

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

我的猜測是VS不會在member / properties / etc上實現所有可能的結果。 對於IDE,這就是為什么它不起作用的原因。 如果多次提供該屬性,則在調試器視圖中僅使用第一個:請參見我的示例並對其進行調試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM