Есть ли атрибут .Net для предотвращения оценки свойств в отладчике? - PullRequest
5 голосов
/ 21 февраля 2009

Я видел несколько классов в платформе с таким поведением (символ обновления в окне просмотра и предупреждение). Контролируется ли это Атрибутом? Если так, как я могу подражать этому в моей библиотеке?

РЕДАКТИРОВАТЬ: Спасибо за информацию! Чтобы уточнить, я разрабатываю структуру со свойствами, которые должны получить доступ к данным из одного потока. К сожалению, когда я нахожусь в отладчике, я получаю странное поведение из-за окон наблюдения и т. Д. У меня есть опыт работы с атрибутом Debugger Browsable; однако, я бы предпочел отобразить свойства после того, как основной поток получил к ним доступ / установил их. Я видел, особенно в IEnumerables, что отладчик не будет оценивать без ввода данных пользователем. ... Есть ли способ пометить эти свойства как требующие "неявной оценки", или я могу не иметь свой торт и есть его тоже?

Ответы [ 3 ]

6 голосов
/ 21 февраля 2009

Это не контролируется атрибутами. Это неотъемлемая особенность отладчика.

Основной причиной этой функции является предотвращение нежелательной оценки функций пользователем. Func Evals - опасная операция в отладчике, которая может привести к значительному замедлению или повреждению состояния программы. Отладчик очень внимательно следит за тем, чтобы не допустить непреднамеренного использования дополнительных функций, которые могут ухудшить ваш опыт отладки.

В случае, если в окне «Watch / Locals / Auto» есть элемент, который может вызвать функцию funval, и отладчик не верит, что функция должна произойти, значение станет серым, и кнопка обновления появится в столбец значений. Нажатие на эту кнопку говорит отладчику: «Нет, я не хочу оценивать это выражение».

Есть много причин, по которым это происходит в отладчике. Следующие 2 являются наиболее вероятными.

Неявная оценка свойства отключена

Инструменты -> Отладчик -> Параметры -> Включить неявную оценку свойств

Если это значение не отмечено, вы говорите отладчику, что не выполняйте автоматическую оценку свойств. Свойства под капотом - это просто вызовы функций. Как правило, они безопаснее, чем обычные вызовы функций, но не всегда.

Но вы все равно можете принудительно оценить свойства, введя их непосредственно в окно просмотра. Если вы введете 2 подряд, первое значение станет «устаревшим». Это связано с тем, что при вводе второго выражения в окне просмотра все остальные выражения будут переоцениваться. Зачем? Потому что акт оценки любого выражения мог изменить результаты других.

Поскольку неявный func eval отключен, первое свойство не будет автоматически оцениваться, и вы должны принудительно его выполнить.

Func Eval и Step

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

Это делается по многим причинам, хотя одной из наиболее важных причин является повышение производительности. Пользователь очень часто вводит много выражений в окне просмотра, и, безусловно, нередко проводится оценка функции. По одному они не очень медленные. Но представьте, что вы пытаетесь быстро пройтись по некоторому коду, и у вас в окне просмотра было 10 функций. Это может быстро накапливаться и значительно ухудшать ваш опыт. Таким образом, функциональные ценности не переоцениваются автоматически.

4 голосов
/ 21 февраля 2009

Хотя это не создает значок обновления, на который вы ссылаетесь, очень полезным атрибутом является System.Diagnostics.DebuggerBrowsableAttribute, который позволяет скрыть поля, которые когда-либо появлялись в окнах наблюдения. Это полезно, когда поля и дублируются средствами доступа к свойствам, и они не должны отображаться дважды, или если свойство выполняет какую-то существенную операцию (например, то, что вы предлагаете), и вам нужно всегда подавлять его, чтобы отладчик не ' не могу это оценить.

1 голос
/ 22 февраля 2009

Это не совсем то, что вы ищете, но если вы примените атрибут [DebuggerStepThrough] к получателю / установщику свойства, это предотвратит нарушение отладчиком свойства, если явно не задать точку останова на строке. Это может быть полезно, если вы хотите подождать и установить точку останова после того, как узнаете, что оценка безопасна. Вы также можете использовать [DebuggerHidden], если хотите скрыть все отладки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...