Ответ 1
Вот простая тестовая программа (Включите только мой код и поместите точку прерывания в строках Test 1,2,3 и 4), упомянутую ниже:
class Program
{
static void Main(string[] args)
{
TestDebuggerStepperBoundary(); // Test 1
Test(); // Test 2
TestDebuggerNonUserCode(TestDebuggerStepperBoundary); // Test 3
TestDebuggerNonUserCode(Test); // Test 4
}
[DebuggerNonUserCode]
private static void TestDebuggerNonUserCode(Action action) { action(); }
[DebuggerStepperBoundary]
private static void TestDebuggerStepperBoundary() { SomethingHorrible(); }
[DebuggerNonUserCode]
private static void Test() { SomethingHorrible(); }
private static void SomethingHorrible()
{
var foo = "bar";
}
}
После просмотра определения для DebuggerStepperBoundaryAttribute, я не думаю, что это определение совершенно правильно:
Атрибут DebuggerStepperBoundaryAttribute используется как escape от эффекта атрибута DebuggerNonUserCodeAttribute.
Вы можете использовать DebuggerStepperBoundaryAttribute
, не будучи в контексте DebuggerNonUserCodeAttribute
. F11 в тесте 1 немедленно попадает в следующую точку останова на тесте 2, не находясь в "эффекте a DebuggerNonUserCodeAttribute
". Я думаю, что это должно действительно читать: "Атрибут DebuggerStepperBoundaryAttribute используется как побег от эффекта Step Into или Step Over во время отладки". Остальная часть defintion имеет смысл:
При выполнении в пределах атрибута DebuggerNonUserCodeAttribute, созданный разработчиком код выполняется как шаг за шагом до следующего пользовательский код встречается. Когда переключатели контекста выполняются на нить, следующий входящий в систему код, входящий в модуль кода, может не соответствовать к коду, который был в процессе отладки. Чтобы избежать этого отладки, используйте атрибут DebuggerStepperBoundaryAttribute для избежать перехода от кода к запущенному коду. Например, в Visual Studio 2005, столкнувшись с атрибутом DebuggerStepperBoundaryAttribute выполняя код, используя клавишу F10 (или команду "Шаг за шагом" ) имеет тот же эффект, что и нажатие клавиши F5 или с помощью Start Команда отладки.
Итак, чтобы ответить на мой вопрос, если бы был какой-то другой код, который вы должны были вызвать, то вы не можете/не хотите добавлять DebuggerStepThrough, DebuggerNonUserCode или DebuggerHidden, но если отладчик, введенный в этот метод, будет более резким, чем от пошагового кода до запуска кода, а затем использовать DebuggerStepperBoundaryAttribute. (В моей примерной программе F11 на Test 2 вы сразу попадаете в SomethingHorrible
, что потенциально хуже, чем переход к запуску (F5)). Он был добавлен явно добавленным контекстным переключением потоков, и за его пределами я не знаю любой ситуации, в которой это было бы полезно.