Is it possible to use conditions in a DebuggerDisplay?

試著忘記壹切 提交于 2019-12-03 09:53:56

You can use the conditional operator (?:)

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

IsTempFile == false


IsTempFile == true

You can use whatever expression is valid.

However, keep in mind that the debugger will evaluate these expressions a lot, so the more complicated you make them, the more you will start to noticed reduced debugging speed (e.g. when stepping through code).

Another major thing to consider is that the expression is evaluated by the debugger for the language using the class. If both the class and all its potential users are in C#, there is no problem and you can use things like the ternary operator. However, if your class is also to be used from another language, then:

  1. there's no guarantee the debugger will even use the [DebuggerDisplay] attribute at all,
  2. if it does, there's no guarantee that it will try to evaluate {expression} blocks, and
  3. there's a very good chance that it will fail to evaluate your C# expression if you start doing anything fancy (like using ?:)

The safest thing would be to add a private property to compute the debugger value:

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

}

It's a private property, so it doesn't get in the way of any potential subclasses.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!