97

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

これらは、の使用法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);
    }
}

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

4

5 に答える 5

103

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

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

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

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

于 2010-07-06T23:53:23.777 に答える
7

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

戻ってきてデバッガーに表示されるものToString()が希望どおりでない場合は、を使用しますDebuggerDisplayAttribute

于 2014-12-29T23:10:38.873 に答える
7

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

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

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

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

于 2018-03-01T10:01:35.600 に答える
0

DebuggerDisplayできることはかなり限られています。特定のメンバーの値を表示するために使用できるフォーマット文字列のみがあります。

条件付きでデータを表示したい場合は、いくつかのレベルの深さのデータ、または集約されたデータToString()が唯一のオプションである可能性があります。

于 2020-12-23T15:15:34.453 に答える
0

Xamarinを使用してAndroid向けに開発する場合、ToStringメソッドはウォッチウィンドウに表示されませんが、DebuggerDisplayは表示されます。

于 2021-10-27T20:47:53.220 に答える