簡體   English   中英

[DebuggerDisplay(...)]屬性有用的示例?

[英]Example where [DebuggerDisplay(…)] attribute is useful?

我正在尋找一個很好的具體示例,顯然需要使用某些東西覆蓋ToString() ,但是使用[DebuggerDisplay(...)]自定義屬性在調試器中顯示其他內容?

例如,假設二叉樹的Node對象。

ToString()只想顯示該節點的有效負載,而DebuggerDisplay可能還會顯示它指向的節點。

您還可以添加注意,VB.NET中的調試器不會評估ToString()。 因此,如果您計划使用多種語言進行開發,請熟悉這個屬性。 它在MSDN頁面上說明: https//msdn.microsoft.com/en-us/library/x810d419.aspx

調試器是否評估此隱式ToString()調用取決於“工具/選項/調試”對話框中的用戶設置。 Visual Basic不實現此隱式ToString()評估。

我更喜歡在ToString上使用這個屬性,因為假設我不需要將ToString()方法用於其他任何東西,我不喜歡讓方法無所事事的想法。

如果您需要其他原因,我認為使用聲明性方法更有意義,因為調試器顯示字符串只是一些元數據,它也可以被其他一些工具使用。

假設您有一個現有的應用程序,其中.ToString()應該將對象序列化為字符串。 這不是一個好主意,但假設你處於那種情況。 然后,您仍然可以使用[DebuggerDisplay(...)]讓您的生活更輕松,而不會修改此類(不可否認,但我懷疑並不罕見)類與應用程序的其余部分之間的合同。

.NET4中的Lazy使用它來顯示調試中的重要屬性:

[Serializable, 
DebuggerDisplay("ThreadSafetyMode={Mode}, IsValueCreated={IsValueCreated}, IsValueFaulted={IsValueFaulted}, Value={ValueForDebugDisplay}"), 
DebuggerTypeProxy(typeof(System_LazyDebugView<>)), ComVisible(false), HostProtection(SecurityAction.LinkDemand, Synchronization=true, ExternalThreading=true)]
public class Lazy<T>
{
...
}

ArrayList還使用:

    [Serializable, ComVisible(true), DebuggerTypeProxy(typeof(ArrayListDebugView)), 
DebuggerDisplay("Count = {Count}")]
    public class ArrayList : IList, ICollection, IEnumerable, ICloneable
    {
    ...
    }

顏色結構

    [Serializable, StructLayout(LayoutKind.Sequential), TypeConverter(typeof(ColorConverter)), 
DebuggerDisplay("{NameAndARGBValue}"), 
Editor("System.Drawing.Design.ColorEditor, System.Drawing.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
    public struct Color
    {
    ...
    }

您可以使用.NET Reflector工具查看它。

暫無
暫無

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

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