C#デバッグ:[DebuggerDisplay]またはToString()?


92

{MyNamespace.MyProject.MyClass}デバッガーに表示する代わりに、デバッグ情報の有用性を高めるには2つの方法があります。

これらは、の使用法DebuggerDisplayAttributeToString()方法です。

using System.Diagnostics;
...

[DebuggerDisplay("Name = {Name}")]
public class Person
{
    public string Name;
}

または

public class Person
{
    public string Name;
    public override string ToString()
    {
        return string.Format("Name = {0}", Name);
    }
}

どちらか一方を優先する理由はありますか?両方をしない理由はありますか?それは純粋に個人的な好みですか?

回答:


94

使用[DebuggerDisplay]はデバッガーのみを対象としています。ToString()をオーバーライドすると、実行時に表示が変更されるという「副作用」があります。

これは良いことかもしれませんし、そうでないかもしれません。

多くの場合、デバッグ中に標準ToString()出力よりも多くの情報が必要になります。その場合は、両方を使用します。

たとえば、あなたの場合、「ToString」の実装は私には奇妙に思えます。「Person」クラスのToString()実装は、「Name = PersonsName」ではなく、Nameを直接返すことを期待します。ただし、デバッグ中に、その追加情報が必要になる場合があります。


9
+1リードの「副作用」ポイントに追加するにToStringは:「デフォルトの表示文字列」としてよく使用されます。たとえば、byConsole.WriteLineまたはWPFデータバインディングです。
Stephen Cleary 2010

承知しました; 文字列の形式は、DebuggerDisplayに指定された文字列との類似性を強調するために、視覚的な例として指定されたものです。あなたが言うように、DebuggerDisplayフォーマットは名前を直接返すこともできます。しかし、副作用についてのあなたの指摘はわかります-それは私が探している種類の区別です。私は通常、クラスでToStringメソッドをあまり使用しないので(上記の目的を除いて)、他の使用法は私にはそれほど明白ではありませんでした。ありがとう!
bwerks 2010

5

「カスタムクラスまたは構造体を作成するときは、タイプに関する情報をクライアントコードに提供するために、ToStringメソッドをオーバーライドする必要があります。」— MSDN

どのような場合にToString()戻り、デバッガで見ると、あなたは、あなたが使用したいものではありませんDebuggerDisplayAttribute


4

デバッガーの速度も考慮に入れることができます。

DebuggerDisplayAttributeフォーマット式は、各デバッグステップ/ブレークポイントの後にデバッガーによって解釈されます。

ToStringはコードでコンパイルされるため、デバッガーによる実行がはるかに高速になります。

これは条件付きブレークポイントでも同じです。条件式が遅すぎて、実行がブレークポイントに到達するたびにデバッガーで解釈できない場合は、ブレークポイントを削除して、代わりに次のような一時コードを追加すると便利です。 if (condition) Debugger.Break();

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.