2012-10-15 47 views
16

考慮下面的類:是否可以在DebuggerDisplay中使用條件?

[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; } 
} 

我想補充的基礎上,IsTempFileName財產調試器顯示。當實例是臨時文件時,我想添加字符串, TempFileName = {TempFileName,nq}。我將如何實現這一目標?

+1

如何簡單地添加一個返回你想要的方法?我個人通常會重寫'ToString',但您可以簡單地添加一些其他方法,並將其用作調試器字符串。 – CodesInChaos

+1

可以完成,但這是最後的手段,因爲一種方法會向僅用於調試的類引入功能。像這樣的東西聞起來像一個糟糕的設計。出於調試目的,我從不重寫'ToString()'。 –

回答

23

可以使用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

哇!你應該喝一杯啤酒! (剛剛刪除了逗號前的空格。)你有關於這個的任何文檔嗎? –

+0

@ KeesC.Bakker這只是作爲表達式 – Justin

+0

的一部分而使用的['?'運算符](http://msdn.microsoft.com/zh-cn/library/ty67wk28.aspx)我不知道我們可以在這些'魔術'字符串中做類似的事情。 –

3

你可以使用任何有效的表達式。

但是,請記住,調試器會對這些表達式進行很多評估,因此,製作它們越複雜,您越會注意到調試速度降低(例如逐步執行代碼時)。

要考慮的另一個主要問題是表達式由調試器使用該類的語言進行評估。 如果這個類和它的所有潛在用戶都在C#中,那麼沒有問題,你可以使用諸如三元運算符之類的東西。 然而,如果你的類也從另一種語言被使用,則:

  1. 沒有保證調試器甚至會使用[DebuggerDisplay]屬性可言,
  2. 如果是這樣,也不能保證它會嘗試評估{表達式}塊,
  3. 有一個非常好的機會,它會失敗,如果你開始做任何幻想(如使用來評估你的C#表達?:)

最安全的做法會是增加一個私有財產來計算d ebugger值:

[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; 
    } 
    } 

} 

這是一種私有財產,所以它不以任何可能的子類的方式獲得。

相關問題