2012-10-15 11 views
16

Rozważmy następujące klasy:Czy możliwe jest użycie warunków na ekranie debuggera?

[DebuggerDisplay("{GetType().Name,nq}: FileName = {FileName,nq}")] 
public class FileWrapper 
{ 
    public string FileName { get; set; } 
    public bool IsTempFile { get; set; } 
    public string TempFileName { get; set; } 
} 

chciałbym dodać wyświetlacz debuggera w oparciu o właściwość IsTempFileName. Chciałbym dodać ciąg , TempFileName = {TempFileName,nq}, gdy instancja jest plikiem tymczasowym. Jak mógłbym osiągnąć coś takiego?

+1

Co powiesz na proste dodanie metody, która zwraca, co chcesz? Osobiście zwykle przesłonię 'ToString', ale można po prostu dodać inną metodę i użyć jej jako ciągu debuggera. – CodesInChaos

+1

Można to zrobić, ale to byłaby ostatnia deska ratunku, ponieważ metoda wprowadza funkcje do klasy, która służy tylko do debugowania. Coś takiego pachnie jak zły projekt. Nigdy nie zastępuję 'ToString()' do celów debugowania. –

Odpowiedz

23

Można użyć conditional operator (?:)

[DebuggerDisplay("{GetType().Name,nq}: FileName = {FileName,nq}{IsTempFile ? \", TempFileName: \" + TempFileName : System.String.Empty,nq}")] 

IsTempFile == false 

enter image description here


IsTempFile == true 

enter image description here

+1

Wow! Zasługujesz na piwo! (Po prostu usunąłem spację przed przecinkiem.) Czy macie jakieś dokumenty na ten temat? –

+0

@ KeesC.Bakker Jest to tylko operator ['?'] (Http://msdn.microsoft.com/en-us/library/ty67wk28.aspx) używany jako część wyrażenia – Justin

+0

Nie wiedziałem, że moglibyśmy robić takie rzeczy w tych "magicznych" strunach. –

3

Możesz użyć dowolnego wyrażenia, które jest prawidłowe.

Należy jednak pamiętać, że debugger będzie często oceniał te wyrażenia, więc im bardziej skomplikowane, tym bardziej zaczniesz zauważać zmniejszoną prędkość debugowania (np. Podczas przechodzenia przez kod).

Inną ważną rzeczą, którą należy wziąć pod uwagę, jest to, że wyrażenie jest oceniane przez debugger dla języka używającego tej klasy. Jeśli zarówno klasa, jak i wszyscy jej potencjalni użytkownicy są w języku C#, nie ma problemu i można używać takich rzeczy, jak operator trójskładnikowy. Jednakże, jeśli klasa ma również zostać wykorzystane w innym języku, a następnie:

  1. nie ma gwarancji, debugger będzie nawet użyć [DebuggerDisplay] atrybut w ogóle,
  2. jeśli tak, to nie ma gwarancji, że będzie starał się ocenić {wyrażenie} klocki, i
  3. istnieje bardzo duża szansa, że ​​nie będzie można ocenić # ekspresję C, jeśli zaczniesz robić niczego wyjątkowego (jak przy użyciu? :)

najbezpieczniejszym rzeczą byłoby być dodać prywatną własność do obliczenia d Wartość ebuggera:

[DebuggerDisplay("{DebugValue,nq}")] 
public class FileWrapper { 

    public string FileName  { get; set; } 
    public bool IsTempFile { get; set; } 
    public string TempFileName { get; set; } 

    private string DebugValue { 
    get { 
     var text = string.Format("{0}: FileName={1}", this.GetType(), this.FileName); 
     if (this.IsTempFile) 
     text += string.Format(", TempFileName={0}", this.TempFileName); 
     return text; 
    } 
    } 

} 

To własność prywatna, więc nie przeszkadza żadnej potencjalnej podklasie.

Powiązane problemy