День шестидесятый. #TipsAndTricks

10. Управление полем значения в отладчике

Мощь современного отладчика заключается в отображении данных объекта при отладке в простой и понятной форме. Поэтому, когда отладчик отображает эту информацию, он должен показывать наиболее интересные значения сразу. К сожалению, отладчику трудно анализировать различные объекты и выделять в них «самое важное». Единственным универсальным решением будет контроль за отображением значений в отладчике, что состоит в добавлении атрибутов к объектам.

Отладка с применением атрибутов даёт разработчику типа возможность указать, как объект будет выглядеть в отладчике. Это достигается применением атрибута DebuggerDisplay. Допустим, вы отлаживаете следующий код:

class Person

{

public string FirstName;

public string LastName;



public Person(string first, string last)

{

this.FirstName = first;

this.LastName = last;

}



public string FullName {get => $"{LastName}, {FirstName}";} }



class Program

{

static void Main(string[] args)

{

List<Person> presidents = new List<Person>

{

new Person("George", "Washington"),

new Person("John", "Adams"),

new Person("Thomas", "Jefferson"),

new Person("James", "Madison"),

new Person("James", "Monroe")

};

}

}

Если вы установите точку прерывания на закрывающей скобке метода Main и посмотрите на значения элементов списка, вы увидите малозначащую строку {Person} (см. рисунок ниже).

Если вы хотите посмотреть свойства объекта James Madison, то вы должны знать, что он четвёртый в списке. Можно переопределить метод ToString типа Person, тогда отладчик вызовет его. Но это приведёт к оценке значения функции, что в сотню раз медленнее обычного вывода значения данных. Кроме того, вывод в отладчике может отличаться от желаемого вывода метода ToString в программе. Поэтому определите атрибут DebuggerDisplay следующим образом:

[DebuggerDisplay("Name: {FullName,nq}")]

class Person

Здесь атрибут приводит к выводу значения свойства FullName без кавычек (формат ‘nq’ – см. форматы отладчика в предыдущем посте).



Источник: https://devblogs.microsoft.com/visualstudio/7-hidden-gems-in-visual-studio-2017/