过去,我在调试时一直被“访问器中的副作用”问题所困扰;这意味着我已经初始化了缓存而没有触发我的断点(因为它已经在 Visual Studio 中暂停了)。所以我一直想知道 Visual Studio 用来“乱序”执行代码的机制,以便在调试器中评估属性。在我看来,这会绕过 CLR?
所以问题是:从技术角度来看,这是如何完成的?解释它的文章会很有帮助。
过去,我在调试时一直被“访问器中的副作用”问题所困扰;这意味着我已经初始化了缓存而没有触发我的断点(因为它已经在 Visual Studio 中暂停了)。所以我一直想知道 Visual Studio 用来“乱序”执行代码的机制,以便在调试器中评估属性。在我看来,这会绕过 CLR?
所以问题是:从技术角度来看,这是如何完成的?解释它的文章会很有帮助。
看起来 VS2012(可能还有早期版本)使用“主线程”或者可能是命中断点的线程来执行属性的 getter。
这是我的测试代码:
static class TestSideEffects
{
public static void Test()
{
Console.WriteLine("Main Thread: {0}", Thread.CurrentThread.ManagedThreadId);
var o = new TestSubject();
Console.WriteLine("Property Value: {0}", o.IntGetValueNoSe());
}
}
class TestSubject
{
private int _prop=0;
public int TheProperty
{
get
{
Console.WriteLine("Thread accessing the property: {0}", Thread.CurrentThread.ManagedThreadId);
return ++_prop;
}
}
public int IntGetValueNoSe(){return _prop; }
}
我设置了两个断点:在 Test 方法的第 3 行和 getter 本身,每次我将鼠标悬停在 o 实例上时,它都会执行 getter 而不会触发另一个断点。它使用相同的(在这种情况下为 main)线程。
这是测试程序的输出:
Main Thread: 8
Thread accessing the property: 8
Thread accessing the property: 8
Thread accessing the property: 8