web-dev-qa-db-ja.com

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

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

これらは、_[DebuggerDisplayAttribute][1]_およびToString()メソッドの使用です。

_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);
    }
}
_

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

83
bwerks

_[DebuggerDisplay]_の使用は、デバッガ専用です。 ToString()をオーバーライドすると、実行時に表示を変更する「副作用」があります。

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

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

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

86
Reed Copsey

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

ToString()が返した結果がデバッガに表示されたくない場合は、DebuggerDisplayAttributeを使用します。

5
Piotr Perak

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

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

ToStringはコード内でcompiledであるため、デバッガによる実行がはるかに高速です。

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

4
Wizou