デバッガーで_{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);
}
}
_
どちらか一方を優先する理由はありますか?両方をしない理由はありますか?純粋に個人的な好みですか?
_[DebuggerDisplay]
_の使用は、デバッガ専用です。 ToString()をオーバーライドすると、実行時に表示を変更する「副作用」があります。
これは良いことかもしれませんし、そうでないかもしれません。
デバッグ中に、標準のToString()
出力よりも多くの情報が必要になることがよくあります。その場合、両方を使用します。
たとえば、あなたの場合、「ToString」の実装は私には奇妙に思えます。 「Person」クラスのToString()実装は、「Name = PersonsName」ではなく、直接Nameを返すことを期待します。ただし、デバッグ中に、その追加情報が必要になる場合があります。
「カスタムクラスまたは構造体を作成するときは、ToStringメソッドをオーバーライドして、型に関する情報をクライアントコードに提供する必要があります。」 — [〜#〜] msdn [〜#〜]
ToString()
が返した結果がデバッガに表示されたくない場合は、DebuggerDisplayAttribute
を使用します。
デバッガーの遅延も考慮に入れることができます。
DebuggerDisplayAttribute
フォーマット式は解釈済みであり、各デバッグステップ/ブレークポイントの後にデバッガーによって実行されます。
ToString
はコード内でcompiledであるため、デバッガによる実行がはるかに高速です。
これは条件付きブレークポイントと同じです。実行がブレークポイントに到達するたびに、条件式が遅すぎてデバッガーで解釈できない場合は、ブレークポイントを削除し、代わりに次のような一時コードを追加すると便利です。if (condition) Debugger.Break();