C # hata ayıklama: [DebuggerDisplay] veya ToString ()?


92

{MyNamespace.MyProject.MyClass}Hata ayıklayıcıda görmek yerine hata ayıklama bilgilerinin kullanışlılığını artırmanın iki yolu vardır .

Bunlar kullanımı DebuggerDisplayAttributeve ToString()yöntemidir.

using System.Diagnostics;
...

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

veya

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

Birini diğerine tercih etmek için herhangi bir sebep var mı? İkisini birden yapmamak için herhangi bir sebep var mı? Tamamen kişisel bir tercih mi?

Yanıtlar:


94

Kullanımı [DebuggerDisplay]yalnızca hata ayıklayıcı içindir. ToString () öğesinin geçersiz kılınması, çalışma zamanında ekranı değiştirmenin "yan etkisine" sahiptir.

Bu iyi bir şey olabilir veya olmayabilir.

Genellikle, hata ayıklama sırasında standart ToString()çıktınızdan daha fazla bilgi istersiniz , bu durumda her ikisini de kullanırsınız.

Örneğin, sizin durumunuzda, "ToString" uygulaması bana tuhaf geliyor. Bir "Kişi" sınıfı ToString () uygulamasının "Ad = KişiAdı" değil, yalnızca doğrudan Adı döndürmesini beklerdim. Bununla birlikte, hata ayıklama sırasında bu ekstra bilgiyi isteyebilirim.


9
+1 Reed'in "yan etki" noktasına eklemek için: ToStringgenellikle bir "varsayılan gösterim dizisi" olarak kullanılır, örn. Console.WriteLineVeya WPF veri bağlama ile.
Stephen Cleary

Elbette; dizenin biçimi, DebuggerDisplay için verilen dizgeye benzerliğini vurgulamak için görsel bir örnek için verilmiştir. DebuggerDisplay biçimi, sizin de söylediğiniz gibi adı doğrudan döndürebilir. Yine de yan etkilerle ilgili düşüncenizi anlıyorum - aradığım türden bir ayrım. Tipik olarak ToString yöntemini sınıflarda fazla kullanmıyorum (yukarıda verdiğim amaç dışında) bu nedenle diğer kullanımları benim için açık değildi. Teşekkürler!
bwerks

5

"Özel bir sınıf veya yapı oluşturduğunuzda, türünüz hakkında istemci koduna bilgi sağlamak için ToString yöntemini geçersiz kılmalısınız." - MSDN

Geri ToString()dönen ve hata ayıklayıcıda gördüğünüz şey istediğiniz gibi değilse, o zaman kullanırsınız DebuggerDisplayAttribute.


4

Hata ayıklayıcının yavaşlığı da hesaba katılabilir:

DebuggerDisplayAttributeformat ifadesi, her hata ayıklama adımından / kesme noktasından sonra hata ayıklayıcı tarafından yorumlanır .

ToStringolduğu derlenmiş kodunuzu ve bu nedenle çok daha hızlı hata ayıklayıcı tarafından çalıştırmaktır.

Koşullu kesme noktaları için de durum aynıdır: Koşullu ifade, yürütme kesme noktasına her ulaştığında hata ayıklayıcı tarafından yorumlanamayacak kadar yavaşsa, kesme noktasını kaldırmak ve bunun yerine aşağıdaki gibi geçici kod eklemek yararlı olabilir: if (condition) Debugger.Break();

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.