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?

bwerks
źródło

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.

Reed Copsey
źródło
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.

Piotr Perak
źródło
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();

Wizou
źródło