Debugowanie C #: [DebuggerDisplay] czy ToString ()?


92

Istnieją dwa sposoby na zwiększenie użyteczności debugowania informacji zamiast ich wyświetlania {MyNamespace.MyProject.MyClass}w debugerze.

Oto zastosowanie DebuggerDisplayAttributei ToString()metoda.

using System.Diagnostics;
...

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

lub

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

Czy jest jakiś powód, aby preferować jedno od drugiego? Jest jakiś powód, by nie robić obu tych rzeczy? Czy to czysto osobiste preferencje?

Odpowiedzi:


94

Używanie [DebuggerDisplay]jest przeznaczone tylko dla debugera. Zastępowanie ToString () ma „efekt uboczny” zmiany sposobu wyświetlania w czasie wykonywania.

To może być dobre, ale nie musi.

Często podczas debugowania chcesz uzyskać więcej informacji niż standardowe ToString()wyjście, w takim przypadku użyjesz obu.

Na przykład w twoim przypadku implementacja „ToString” wydaje mi się dziwna. Spodziewałbym się, że implementacja ToString () klasy „Person” zwróci bezpośrednio nazwę Name, a nie „Name = PersonsName”. Jednak podczas debugowania mogę potrzebować dodatkowych informacji.


9
+1 Aby dodać do punktu „efektu ubocznego” Reeda: ToStringjest często używany jako „domyślny ciąg wyświetlania”, np. Przez Console.WriteLinepowiązanie danych lub WPF.
Stephen Cleary,

Pewnie; Format ciągu został właśnie podany jako wizualny przykład, aby podkreślić jego podobieństwo do ciągu podanego dla DebuggerDisplay. Format DebuggerDisplay może równie dobrze zwrócić nazwę bezpośrednio, jak powiedziałeś. Widzę jednak twój punkt widzenia na temat skutków ubocznych - tego rodzaju rozróżnienia szukam. Zwykle nie używam metody ToString w klasach (z wyjątkiem celu, który podałem powyżej), więc jej inne zastosowania nie były dla mnie tak oczywiste. Dzięki!
bwerks

5

„Tworząc klasę lub strukturę niestandardową, należy zastąpić metodę ToString, aby dostarczyć informacje o typie do kodu klienta”. - MSDN

Jeśli to, co ToString()powróci i zobaczysz w debugerze, nie jest tym, czego chciałbyś, użyj DebuggerDisplayAttribute.


4

Można również wziąć pod uwagę powolność debuggera:

DebuggerDisplayAttributewyrażenie formatu jest interpretowane przez debuger po każdym kroku debugowania / punkcie przerwania.

ToStringjest wkompilowany w Twój kod i dlatego jest znacznie szybszy do wykonania przez debuger.

To samo dotyczy warunkowych punktów przerwania: jeśli wyrażenie warunkowe jest zbyt wolne, aby zinterpretować je przez debuger za każdym razem, gdy wykonanie osiągnie punkt przerwania, przydatne może być usunięcie punktu przerwania i zamiast tego dodanie tymczasowego kodu w następujący sposób: if (condition) Debugger.Break();

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.