2012-10-15 107 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; 
    } 
    } 

} 

这是一种私有财产,所以它不以任何可能的子类的方式获得。

相关问题