是否可以在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}我想添加字符串, TempFileName = {TempFileName,nq} 。 我将如何实现这一目标?

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

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

 IsTempFile == false 

在此处输入图像描述


 IsTempFile == true 

在此处输入图像描述

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

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

另一个需要考虑的主要问题是调试器使用类来评估表达式。 如果该类及其所有潜在用户都在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; } } } 

它是一个私有属性,因此它不会妨碍任何潜在的子类。