Essentials: Полегшуємо та покращуємо відладку С# коду за допомогою атрибутів
Отже цим постом хочеться почати іще одну серію - про атрибути.
Це досить потужний засіб, однак при великій кількості наворотів нашої студії в цей бік не завжди навіть хочеться дивитись. Однак було б корисно... ;). на мій погляд, з використанням цих речей найкраще знайомитись на зрозумілих та прозорих прикладах.
Отже почнемо.
Спочатку розглянемо клас. В ньому матимемо два поля (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...
Останні два, якщо будуть замовлення, розглянемо окремо.
А зараз - користуйтесь;)