Есть ли атрибут .Net для предотвращения оценки свойств в отладчике?

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

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

Ответ 1

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

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

В случае, когда в окне watch/locals/auto есть элемент, который может вызвать func eval, и отладчик не считает, что функция func eval должна произойти, значение будет серым, а кнопка обновления появится в значение столбца. Нажатие на эту кнопку сообщает отладчику: "Нет, я действительно хочу оценить это выражение".

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

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

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

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

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

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

Func Eval и Step

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

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

Ответ 2

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

Ответ 3

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