Использование атрибута DebuggerDisplay в C# — настройка отображаемой в отладчике информации

Отладка кода на крупных проектах занимает огромное количество времени. На дебагинг, обычно, тратится от 10 до 15 процентов времени работы над проектом, и даже если вы пишете чистый и качественный код, все равно вы будете использовать отладчик…

Visual Studio позволяет качественно отлаживать код, предоставляя пользователю необходимые инструменты. Для демонстрации работы, создадим класс User, содержащий имя пользователя, фамилию и его возраст.

    public sealed class User
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public byte Age { get; set; }
    }

Инициализируем данный класс значениями, и посмотрим, что же отобразится в отладчике:

Можно заметить, что мы сразу видим тип данного класса, а при его разворачивании, мы увидим содержимое полей. Конечно, для работы этого вполне может хватить, но, выводимую информацию можно сделать более содержательной, а именно, вместо типа класса, можно сразу выводить его значения в необходимом нам виде. Для этого, перед классом User добавим строку:
[DebuggerDisplay("{FirstName} {LastName}, {Age}")]

Проверим результат:


Если вам мешают кавычки, то можно воспользоваться ключом nq (no quotes), добавив его через запятую к нужному значению.
[DebuggerDisplay("{FirstName, nq} {LastName, nq}, {Age}")]

Теперь создадим список, содержащий нескольких пользователей.

    var userList = new List<user>();
    userList.Add(new User { FirstName = "Андрей", LastName = "Амельченя", Age = 25 });
    userList.Add(new User { FirstName = "Василий", LastName = "Пупкин", Age = 21 });
    userList.Add(new User { FirstName = "Геннадий", LastName = "Васечкин", Age = 19 });

Теперь при отладке, не придётся разворачивать каждый элемент списка, чтобы найти нужного пользователя, так как информация будет отображаться в описании класса.

Теперь предположим, что при отладке, нам необходимо уделить внимание пользователям, чей возраст больше либо равен 25. Для этого дополним класс.

    [DebuggerDisplay("{DebuggerInfo()}")]
    public sealed class User
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public byte Age { get; set; }

        private string DebuggerInfo()
        {
            if (Age >= 25)
            {
                return string.Format("!{0}!> {1} {2}", Age, FirstName, LastName);
            }
            return string.Format("{0} {1}", FirstName, LastName);
        }
    } 

В атрибуте DebuggerDisplay внутри фигурных скобок также можно использовать простые выражения, но это делать не рекомендуется!

Еще один случай, это когда в классе большое количество полей, знать о которых во время отладки не обязательно, а их наличие мешает, так как среди них приходится и��кать требуемые. Чтобы этого не происходило, можно исключить такие поля из показа, воспользовавшись следующим атрибутом.

[DebuggerBrowsable(DebuggerBrowsableState.Never)]

Добавив данный атрибут перед полем с фамилией, при отладке мы её не увидим.

Перечисление DebuggerBrowsableState также может принимать значения RootHidden и Collapsed. Наиболее интересным представляется значение RootHidden, так как оно позволяет скрыть значения корневого элемента, а это избавит от необходимости разворачивать списки, для просмотра.

Атрибут DebuggerDisplay можно применять к следующим элементам

  • Классам;
  • Структурам;
  • Делегатам;
  • Перечислениям;
  • Полям;
  • Свойствам;
  • Assemblies

В заключении хочется сказать, что что нельзя пренебрегаться таким полезным инструментом, но, к сожалению, информацию по атрибуту DebuggerBrowsableState довольно часто опускают, не считая её полезной. К счастью, есть MSDN.

Приятного программирования.

Добавить комментарий