2010-09-13 88 views

回答

7

舉例說,一個二叉樹的節點對象。

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

1

假設您有一個現有的應用程序,其中.ToString()預計將序列化爲字符串。這不是一個好主意,但是假設你處於這種情況。然後,您仍然可以使用[DebuggerDisplay(...)]讓您的生活更輕鬆,而不需要修改該類和應用程序其餘部分之間的這種合同(雖然不好,但我懷疑這不是罕見的)。

+0

XElement.ToString()是一個類似的情況。儘管在調試器中查看XML大概是你想要的。 – 2010-09-13 19:05:02

2

您可以添加也注意ToString()沒有被VB.NET中的調試器評估。所以如果你打算用幾種語言開發,習慣這個屬性是一個好主意。這是MSDN頁面上說:https://msdn.microsoft.com/en-us/library/x810d419.aspx

無論調試器評估這種隱含的ToString()調用依賴於工具/選項/調試對話框的用戶設置。 Visual Basic不實現這個隱式的ToString()評估。

我更喜歡在ToString上使用這個屬性,因爲假設我不需要使用ToString()方法來完成其他任何事情,我不喜歡讓方法坐在那裏的想法。

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

+0

這實際上是不正確的。如果沒有'[DebuggerDisplay(...)]'屬性存在。調試器*會*評估'ToString()'。 – Timwi 2017-03-21 16:50:40

+0

@Timwi:截止到2015年,它在MSDN頁面上聲明。沒有關於VS 2017的信息。我已經在我的回答中澄清了這一點。 – 2017-03-21 18:27:42

1

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

[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 
    { 
    ... 
    } 

或者Color structure

[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工具查看它。

+0

我想OP是問爲什麼在ToString方法中有一些不同的東西是有用的。 – 2010-09-14 13:22:26

相關問題