2012-12-20 19 views
9

W przeszłości podczas debugowania zostałem wypalony przez "efekt uboczny-w-akcesorium"; oznacza to, że miałem inicjowane pamięci podręczne bez wyzwalania moich punktów wstrzymania (ponieważ zostało już ono zatrzymane w Visual Studio). Zastanawiam się więc nad mechanizmem używanym przez Visual Studio do wykonywania kodu "out-of-order", aby ocenić właściwości w debugerze. Wydaje mi się, że to obchodziłoby CLR?W jaki sposób Visual Studio ocenia właściwości podczas debugowania w języku C#?

Pytanie: Jak to zrobić z technicznego punktu widzenia? Pomocne byłyby artykuły wyjaśniające to.

+0

wydaje mi przypomnieć napotykając artykule o nim jakiś czas temu, ale mój Google-fu jest zbyt słaby, aby go odnaleźć. – Smashery

+0

Aby rozpocząć [Efekty uboczne i wyrażenia] (http://msdn.microsoft.com/en-us/library/a7a250bs.aspx) – horgh

Odpowiedz

2

Wygląda na to, że VS2012 (i prawdopodobnie także wcześniejsze wersje) wykonuje getter obiektu za pomocą "głównego wątku" lub wątku, który trafił w punkt przerwania.

To jest mój kod badania:

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; } 
} 

ustawić dwa punkty przerwania: na 3 linii metody badawczej oraz w getter siebie, i za każdym razem unoszą moje myszy nad przykład O - to wykonuje gettera bez wyzwalania drugiego punktu przerwania. Używa tego samego (głównego w tym przypadku) wątku.

Jest to wyjście z programu testowego:

Main Thread: 8 
Thread accessing the property: 8 
Thread accessing the property: 8 
Thread accessing the property: 8 
Powiązane problemy