在运行时跟踪/监视变量?

时间:2015-02-04 16:11:06

标签: c# memory reflection garbage-collection runtime

我正在寻找一种在运行时跟踪/监控变量的方法(不是用于调试),如果是这样的话就抛出某些事件。变化或超出范围。是否有.NET内置方法来执行此操作?比如,不是看着变量本身并持有对它的引用,而是在内存中分配它的位置?

丑陋的伪代码:

public class Dummy {
    public void DummyMethod(int randomVar) {
        randomVar = 4;
    }
}

public class MyApp {
    static void Main() {
        var testVar = 1;
        SuperVariableWatcher.Watch(testVar);
        SuperVariableWatcher.NotifyOnChange += (sender, args) =>
           _logger.Write("variable bla bla has changed.");

        var dummy = new Dummy().DummyMethod(testVar);
             // since Dummy changes testVar, NotifyOnChange would now
             // be called, maybe with information about
             // who has changed it, what value did it contain before
    }
}

当然我可以在SuperVariableWatcher中对它进行引用并检查每纳秒的变化,但即使它能够快速可靠地工作,我也无法看到变量是否已准备就绪被垃圾收集(因为没有引用它),因为我是那个持有引用的人。

我可以想到像 angularJS $watch这样的东西,但是我不确定它是如何在内部工作的。

1 个答案:

答案 0 :(得分:1)

这样做的惯用方法是使用带有notify-changed事件的属性。但是,您的想法中还存在一个基本问题:

// since Dummy changes testVar, NotifyOnChange would now
// be called,

不,它赢了; testVar 未更改testVar中的Main与<{1}}中的randomVar 完全不同,而DummyMethod 的更改不会表示randomVar的更改。该参数是一个值,按值传递:它是从testVar 读取的值的副本;它不是testVar本身。

在一般情况下:不,不可能使用.NET(没有调试API等)来监视任意变量的更改,就像变量一样。这同样适用于领域。