2012-12-20 11 views
9

In passato, sono stato masterizzato dal problema "effetti collaterali in un accesso" durante il debug; il che significa che ho fatto in modo che le cache inizializzassero senza che i miei breakpoint venissero attivati ​​(poiché era già stato messo in pausa in Visual Studio). Quindi mi sono chiesto il meccanismo utilizzato da Visual Studio per eseguire il codice "out-of-order", in modo da valutare le proprietà in un debugger. Mi sembra che ciò aggirerebbe il CLR?In che modo Visual Studio valuta le proprietà durante il debug in C#?

Quindi la domanda: come si fa dal punto di vista tecnico? Gli articoli che lo spiegano sarebbero utili.

+0

Mi sembra di ricordare imbattersi in un articolo su di esso qualche tempo fa, ma il mio Google-fu è troppo debole per trovare di nuovo. – Smashery

+0

Per avviare [Effetti secondari ed espressioni] (http://msdn.microsoft.com/en-us/library/a7a250bs.aspx) – horgh

risposta

2

Sembra che VS2012 (e probabilmente anche versioni precedenti) esegua il getter della proprietà utilizzando "Main Thread" o forse il thread che ha colpito il breakpoint.

Questo è il mio codice di prova:

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

ho impostato due punti di interruzione: al 3 ° riga del metodo di prova e nel getter per sé, e ogni volta mi passa il mouse il mouse sopra l'istanza o - esegue il getter senza attivare l'altro punto di interruzione. Usa lo stesso thread (main in questo caso).

Questa è l'uscita del programma di test:

Main Thread: 8 
Thread accessing the property: 8 
Thread accessing the property: 8 
Thread accessing the property: 8 
Problemi correlati