c# .net debugging debuggerdisplay

c# - ¿Es posible usar condiciones en un DebuggerDisplay?



.net debugging (2)

Considere la siguiente clase:

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

Me gustaría agregar una pantalla de depuración basada en la propiedad IsTempFileName . Me gustaría agregar la cadena , TempFileName = {TempFileName,nq} cuando la instancia es un archivo temporal. ¿Cómo lograría algo esto?


Puedes usar cualquier expresión que sea válida.

Sin embargo, tenga en cuenta que el depurador evaluará estas expresiones mucho, por lo que cuanto más complicadas las haga, más notará que se reducirá la velocidad de depuración (por ejemplo, al pasar por el código).

Otra cosa importante a considerar es que la expresión es evaluada por el depurador para el idioma que usa la clase. Si tanto la clase como todos sus usuarios potenciales están en C #, no hay problema y puede usar cosas como el operador ternario. Sin embargo, si su clase también se va a usar desde otro idioma, entonces:

  1. no hay garantía de que el depurador use el atributo [DebuggerDisplay] en absoluto,
  2. si lo hace, no hay garantía de que intentará evaluar los bloques de {expresión}, y
  3. hay muchas posibilidades de que no pueda evaluar tu expresión de C # si comienzas a hacer algo sofisticado (como usar? :)

Lo más seguro sería agregar una propiedad privada para calcular el valor del depurador:

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

Es una propiedad privada, por lo que no interfiere con ninguna subclase potencial.


Puedes usar el operador condicional (? :)

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

IsTempFile == false

IsTempFile == true