ToString()
何かをオーバーライドすることが明らかに望ましい具体的な例を探していますが、[DebuggerDisplay(...)]
カスタム属性を使用してデバッガーで何か他のものを表示しますか?
4 に答える
たとえば、二分木のノードオブジェクトを考えてみましょう。
はToString()
単にそのノードのペイロードを表示したいだけですが、DebuggerDisplay
おそらくそれが指しているノードも表示します。
ToString() は VB.NET のデバッガーによって評価されないことにも注意してください。したがって、複数の言語で開発する予定がある場合は、この属性に慣れることをお勧めします。MSDN ページに記載されています: https://msdn.microsoft.com/en-us/library/x810d419.aspx
デバッガーがこの暗黙的な ToString() 呼び出しを評価するかどうかは、[ツール]、[オプション]、[デバッグ] ダイアログ ボックスのユーザー設定によって異なります。Visual Basic は、この暗黙的な ToString() 評価を実装していません。
私は ToString よりもこの属性を使用することを好みます。なぜなら、ToString() メソッドを他の目的で使用する必要がないと仮定したからです。メソッドをただそこに置くという考えは好きではありません。
別の理由が必要な場合は、デバッガーの表示文字列は単なるメタデータであり、他のツールでも使用できるため、宣言型アプローチを使用する方が理にかなっていると思います。
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
{
...
}
または色の構造:
[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
{
...
}
.NETReflectorツールを使用して確認できます。
たとえば、.ToString() がオブジェクトを文字列にシリアル化することが期待される既存のアプリケーションがあるとします。それは良い考えではありませんが、あなたがそのような状況にあると仮定してください。その後、[DebuggerDisplay(...)] を使用して、クラスとアプリケーションの残りの部分との間のこの契約 (確かに悪いことですが、異常ではないと思います) を変更せずに、生活を楽にすることができます。