9

過去に、デバッグ時の「アクセサーの副作用」の問題に悩まされていました。つまり、ブレークポイントがトリガーされずにキャッシュが初期化されたことを意味します (Visual Studio で既に一時停止されているため)。そのため、デバッガーでプロパティを評価するために、Visual Studio がコードを「順不同で」実行するために使用するメカニズムについて疑問に思っていました。これはCLRを回避するように思えますか?

質問: これは技術的な観点からどのように行われますか? それを説明する記事は役に立ちます。

4

1 に答える 1

3

VS2012(およびおそらく以前のバージョンも)は、「メインスレッド」またはブレークポイントにヒットしたスレッドを使用してプロパティのゲッターを実行するように見えます。

これは私のテストコードです:

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行目とゲッター自体に2つのブレークポイントを設定し、マウスをoインスタンスに合わせるたびに、他のブレークポイントをトリガーせずにゲッターを実行します。同じ(この場合はメイン)スレッドを使用します。

これは、テストプログラムの出力です。

Main Thread: 8
Thread accessing the property: 8
Thread accessing the property: 8
Thread accessing the property: 8
于 2012-12-27T05:18:21.743 に答える