是否可以在DebuggerDisplay中使用条件?

Kee*_*ker 20 .net c# debugging 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; }
}
Run Code Online (Sandbox Code Playgroud)

我想基于IsTempFileName属性添加调试器显示.我想, TempFileName = {TempFileName,nq}在实例是临时文件时添加字符串.我将如何实现这一目标?

slo*_*oth 29

你可以使用条件运算符(?:)

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

在此输入图像描述


IsTempFile == true
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 哇!你值得喝啤酒!(刚删除逗号前的空格.)你有关于此的任何文档吗? (2认同)

Zas*_*tai 9

您可以使用任何有效的表达式。

但是,请记住,调试器会对这些表达式进行大量计算,因此您使它们越复杂,您就越会注意到调试速度降低(例如,在单步执行代码时)。

另一个要考虑的主要事情是表达式由使用类的语言的调试器评估。如果该类及其所有潜在用户都使用 C#,则没有问题,您可以使用三元运算符之类的东西。但是,如果您的课程也用于其他语言,则:

  1. 不能保证调试器甚至会使用 [DebuggerDisplay] 属性,
  2. 如果是,则不能保证它会尝试评估 {expression} 块,并且
  3. 如果您开始做任何花哨的事情(例如使用 ?:),它很有可能无法评估您的 C# 表达式

最安全的做法是添加一个私有属性来计算调试器值:

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

}
Run Code Online (Sandbox Code Playgroud)

它是私有财产,因此不会妨碍任何潜在的子类。