C # debugging: [DebuggerDisplay] atau ToString ()?

92

Ada dua cara untuk meningkatkan kegunaan informasi debug daripada melihatnya {MyNamespace.MyProject.MyClass}di debugger.

Ini adalah penggunaan DebuggerDisplayAttributedan ToString()metode.

using System.Diagnostics;
...

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

atau

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

Apakah ada alasan untuk memilih salah satu dari yang lain? Ada alasan untuk tidak melakukan keduanya? Apakah ini murni preferensi pribadi?

bwerks
sumber

Jawaban:

94

Menggunakan [DebuggerDisplay]dimaksudkan hanya untuk debugger. Overriding ToString () memiliki "efek samping" dari mengubah tampilan saat runtime.

Ini mungkin atau mungkin bukan hal yang baik.

Seringkali, Anda menginginkan lebih banyak info selama debugging daripada ToString()keluaran standar Anda , dalam hal ini Anda akan menggunakan keduanya.

Misalnya, dalam kasus Anda, implementasi "ToString" tampak aneh bagi saya. Saya mengharapkan implementasi ToString () kelas "Person" hanya mengembalikan Nama secara langsung, bukan "Name = PersonsName". Namun, selama debugging, saya mungkin menginginkan informasi tambahan itu.

Reed Copsey
sumber
9
+1 Untuk menambahkan ke titik "efek samping" Reed: ToStringsering digunakan sebagai "string tampilan default", misalnya, oleh Console.WriteLineatau pengikatan data WPF.
Stephen Cleary
Tentu; format string baru saja diberikan sebagai contoh visual untuk menekankan kesamaannya dengan string yang diberikan untuk DebuggerDisplay. Format DebuggerDisplay juga bisa mengembalikan nama secara langsung, seperti yang Anda katakan. Saya mengerti maksud Anda tentang efek samping - itu adalah jenis perbedaan yang saya cari. Saya biasanya tidak banyak menggunakan metode ToString di kelas (kecuali untuk tujuan yang saya berikan di atas) sehingga penggunaan lainnya tidak begitu jelas bagi saya. Terima kasih!
bwerks
5

"Saat Anda membuat kelas atau struct khusus, Anda harus mengganti metode ToString untuk memberikan informasi tentang jenis Anda ke kode klien." - MSDN

Jika apa yang ToString()kembali dan Anda lihat di debugger bukan yang Anda inginkan, maka Anda gunakan DebuggerDisplayAttribute.

Piotr Perak
sumber
4

Kelambatan debugger juga dapat diperhitungkan:

DebuggerDisplayAttributeekspresi format ditafsirkan oleh debugger setelah setiap langkah debug / breakpoint.

ToStringadalah disusun dalam kode Anda dan karena itu lebih cepat untuk mengeksekusi dengan debugger.

Itu sama dengan breakpoint bersyarat: Jika ekspresi kondisional terlalu lambat untuk ditafsirkan oleh debugger setiap kali eksekusi mencapai breakpoint, akan berguna untuk menghapus breakpoint dan sebagai gantinya menambahkan kode sementara seperti ini: if (condition) Debugger.Break();

Wizou
sumber