Можно ли использовать условия в DebuggerDisplay? - программирование
Подтвердить что ты не робот

Можно ли использовать условия в 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}, когда экземпляр является временным файлом. Как я могу это сделать?

4b9b3361

Ответ 1

Вы можете использовать условный оператор (?:)

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

IsTempFile == false

enter image description here


IsTempFile == true

enter image description here

Ответ 2

Вы можете использовать любое выражение.

Однако имейте в виду, что отладчик очень сильно оценит эти выражения, поэтому чем сложнее вы их сделаете, тем больше вы начнете замечать уменьшенную скорость отладки (например, при переходе по коду).

Еще одна важная вещь, которую следует учитывать, заключается в том, что выражение оценивается отладчиком для языка, использующего класс. Если класс и все его потенциальные пользователи находятся на С#, нет проблем, и вы можете использовать такие вещи, как троичный оператор. Однако, если ваш класс также должен использоваться с другого языка, то:

  • нет гарантии, что отладчик вообще будет использовать атрибут [DebuggerDisplay],
  • если это так, нет гарантии, что он попытается оценить {выражение} блоки и
  • есть очень хороший шанс, что он не сможет оценить ваше выражение С#, если вы начнете делать что-нибудь интересное (например, используя?:)

Самым безопасным было бы добавить частное свойство для вычисления значения отладчика:

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

}

Это частная собственность, поэтому она не мешает каким-либо потенциальным подклассам.