Essentials: Полегшуємо та покращуємо відладку С# коду за допомогою атрибутів

вторник, 18 ноября 2008, Oleksandr Reminnyi

Отже цим постом хочеться почати іще одну серію - про атрибути.

Це досить потужний засіб, однак при великій кількості наворотів нашої студії в цей бік не завжди навіть хочеться дивитись. Однак було б корисно... ;). на мій погляд, з використанням цих речей найкраще знайомитись на зрозумілих та прозорих прикладах.

Отже почнемо.

Спочатку розглянемо клас. В ньому матимемо два поля (int, string), та properties, які будуть їх відображати.

class Person
  {
    private string _name;
    private int _age;
   
    public Person(string name, int age)
    {
      _name = name;
      _age = age;
    }

    public string Name
    {
      get
      {
        return _name;
      }
      set
      {
        _name = value;
      }
    }

    public int Age
    {
      get
      {
        return _age;
      }
      set
      {
        _age = value;
      }
    }

Простий клас:).

DebuggerBrowsableAttrbute

В функцію main додамо код:

 static void Main(string[] args)
    {
      Person p = new Person("Alex", 25);
    }

Поставимо точку зупинки всередині ф-ії меін.

В вікні відладки Автос відображатимуться надлишкові данні:

Дублювання при великій кількості інфи - не потрібне.Тому додаємо атрибут: DebuggerBrowsableAttrbute

біля приватних полів:

    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    private string _name;

    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    private int _age;

Відповідно у вікні відладчика зникла інформація про поля _age, _name

DebuggerBrowsableState:

Never - елемент невидимий

Collapsed - елемент в згорнутому вигляді

RootHidden - приховує кореневий елемент, однак відображає дочірні, якщо вони входять в набор або масив.

DebuggerDisplayAttribute

Ось так виглядає наш клас в Аутос при запуску:

Не дуже інформативно, чи не так? Додаємо динаміки:

перед класом описуємо

  [DebuggerDisplay("The name of person: {_name}, age: {_age}")]
  class Person
  {...

Ось так, просто і зрозуміло... І що ж бачимо після початку відладки?

Відформатували собі відображення, як забажали. Зручно? Атож!

DebuggerHiddenAttribute

Тут ситуація вже описується без малюнків. Цей атрибут просто забороняє вставляти точки зупинки всередину коду, позначеного цим атрибутом.

Навіщо? Дуже просто - іноді ви на 100% впевнені, що код працює правильно, відповідно і відладжувати його не потрібно.

Якщо на прикладі - додаємо код до конструктора:

    [DebuggerHidden()]
    public Person(string name, int age)
    {
      _name = name;
      _age = age;
    }

Все! В конструктор відладчик не зайде.

DebuggerNonUserCodeAttribute

Виконує аналогічні дії до DebuggerHiddenAttribute. Зазвичай цим атрибутом позначають код, згенерований студією.

DebuggerStepperBoundaryAttribute

Цей атрибут "перекриває" дію DebuggerNonUserCodeAttribute. Використовуйте тоді, коли в секції згенерованого коду потрібно все ж таки відладити якусь частину, якій все ж таки потрібна відладка.

DebuggerStepThroughAttribute

Даний атрибут зручний, коли в коді 100% не залишилось помилок. Наприклад в методі InitializeComponent при створенны форм з"являється куча правильного коду, який немає сенсу відлажувати.

Примітка. останні три атрибути наказують Debugger - у ігнорувати код, а не скривають код від нього, як це робить DebuggerHiddenAttribute.

DebuggerTypeProxyAttribute

Цей атрибут дозволить вашому відладчику дивитись на ваш код... "по іншому" :). Він дозволяє відобразити інший (наприклад інкапсульований) об'єкт як основний (зовнішній).

DebuggerVisualizerAttribute

Цей атрибут... Ну, скоріше наворот, ніж атрибут. Він дозволяє вказати відладчику, що для конкретного класу існує співставений візуалізатор.... Який дозволяє використання перегляд властивостей об"єкту майже як з використанням IntelliSense...

Останні два, якщо будуть замовлення, розглянемо окремо.

А зараз - користуйтесь;)


Ищите нас в интернетах!

Комментарии

Свежие вакансии