Как я могу отследить значения переменной, когда они изменяются, во времени выполнения, в C#? Я интересуюсь той же функциональностью, которую обеспечивает отладчик, когда я прослеживаю переменную через шаги выполнения, только что я должен призвать его из своего кода. Своего рода наблюдение значения ключа, но для всех видов переменных (локальный, класс, статичный, и т.д.), не только свойства. Так, в основном получите уведомление, когда значение переменной изменится.
Вы работаете, исходя из предположения, что отладчик может отслеживать изменения переменных. Не может.
Это возможно с неуправляемым кодом, процессор имеет специальные регистры отладки, которые позволяют устанавливать точки останова по данным. Предусмотрено до трех. Он генерирует аппаратное прерывание, когда видит, что записывается определенная ячейка памяти. Однако эта очень полезная функция недоступна в управляемом коде. Сборщик мусора с ним полностью несовместим, он перемещает объекты, давая им другой адрес.
Управляемый отладчик поддерживает условие «при попадании» в точку останова, позволяя выгружать информацию в окно вывода. Однако для этого требуется точка останова, она не может быть вызвана изменением значения переменной. Это также действительно замедляет выполнение кода, поскольку отладчик фактически переходит в состояние прерывания перед выполнением условия.
Очевидное место для установки такой точки останова - средство задания свойств. Это то, что вам понадобится для реализации этой функции в коде. В этом сеттере вы можете делать все, что захотите, например, используя класс Trace.
Как отмечали другие, подобный механизм имеет смысл только при использовании свойств. В .NET вы можете использовать интерфейс INotifyPropertyChanged
.
Пример его реализации смотрите в статье
В статье по ссылке явно говорится о Windows Forms, но вы не привязаны к этому (на самом деле интерфейс объявлен в пространстве имен System.ComponentModel
в System.dll). На самом деле, этот интерфейс широко используется для сценариев связывания данных, например, в WPF.
Единственный разумный способ сделать это без отладчика: не использовать переменную, а использовать свойство и (возможно, условно) добавить трассировку к установщик:
private int myValue;
public int MyValue {
get {return myValue;}
set {
SomeTraceMethod(myValue, value, ...);
myValue = value;
}
}
Очевидно, это не может затем использоваться для произвольных полей / переменных.
Чтобы добавить к тому, что сказал Марк, если вы хотите сделать это для множества свойств и методов, вам стоит обратить внимание на методы аспектно-ориентированного программирования и такие библиотеки, как PostSharp.
Управляемый отладчик использует ICorDebug
COM API практически для всего. Интересующая вас часть - это ICorDebugValue
и его потомки. Обратите внимание, что многие из API отладки требуют, чтобы процесс не был запущен (т.е. встретил точку останова) для того, чтобы произошли различные проверки. Высокоуровневый обзор ICorDebug
находится здесь. Документация по нему довольно скудная, но некоторое гугление может помочь. Удачи.