是否可以在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#中,则没有问题,您可以使用三元运算符之类的东西。 但是,如果您的课程也可以使用其他语言,那么:
- 不能保证调试器甚至会使用[DebuggerDisplay]属性,
- 如果确实如此,则无法保证它会尝试评估{expression}块,并且
- 如果你开始做任何花哨的东西(比如使用?),它很有可能无法评估你的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; } } }
它是一个私有属性,因此它不会妨碍任何潜在的子类。