2009-06-26 11 views
15

Ho un oggetto che devo guardare una funzione di output di molte volte attraverso la finestra di controllo. Il problema è che devo premere il pulsante di aggiornamento ogni volta che passo perché "questa espressione causa effetti collaterali e non sarà valutata". C'è un modo per taggare una funzione con qualcosa come [DoesNotCauseSideEffects] in modo che l'orologio possa automaticamente valutarlo ogni volta che faccio un passo?Visual Studio: Rendi il debugger consapevole del fatto che una funzione non causa "effetti collaterali"

sto codifica C# in VS2008 o 2010.

Edit:. La funzione assomiglia a questo e lo fa, come si può vedere, non provoca effetti collaterali (x, y, z sono tutti doppio)

public override string ToString() 
{ 
    return "{ " + x.ToString(".00") + ", " + y.ToString(".00") + ", " + z.ToString(".00") + "}"; 
} 
+0

Forse se includessi l'espressione e/o gli estratti di codice, potremmo dirti perché lo pensa. –

risposta

3

No, questo non è possibile. La determinazione della presenza o meno di effetti collaterali in una funzione viene effettuata dal valutatore di espressioni specifiche del linguaggio.

Sia C# che VB.Net hanno diversi EE e ognuno ha la propria determinazione se una funzione non causa effetti collaterali. In generale, tuttavia, entrambi considerano una chiamata alla funzione esplicita di avere effetti collaterali e non li elabora in situazioni, come il passo, in cui il debugger vuole disabilitare gli effetti collaterali.

Il modo più semplice per ovviare a questo problema consiste nell'utilizzare una proprietà. Per impostazione predefinita, le istanze di proprietà non sono considerate con effetti collaterali e verranno valutate al passaggio.

EDIT

voluto chiarire alcune idee sbagliate. Né il debugger né l'analizzatore di espressioni eseguiranno alcun tipo di ispezione del metodo per determinare se una funzione ha effetti collaterali. Notano semplicemente la presenza di una funzione e la etichettano come potenzialmente con effetti collaterali. Non tentano di ispezionare il codice del metodo in alcun modo.

+1

Questa risposta sembrerebbe essere ** COMPLETAMENTE ERRATA **. Controlla la risposta qui sotto; è possibile aggiungere ', ac' all'espressione watch e forzerà il debugger a rivalutarlo automaticamente. – Jez

+0

@Jez che funzionano non è universale. Funziona per C# ma non VB.Net – JaredPar

+4

Un motivo in più per non utilizzare VB.NET ;-) – Jez

-2

Avete provato a fare in modo che la funzione non modifichi proprietà di classe o variabili globali? La mia definizione pratica di "effetti collaterali" è "modifiche all'ambiente di esecuzione che vengono eseguite durante l'esecuzione di una funzione". Quindi, questa funzione provoca effetti collaterali:

void addValues(int operand1, int operand2) { 
    globalSum = operand1 + operand2; 
} 

ma questa funzione non è così:

int addValues(int operand1, int operand2) { 
    return operand1 + operand2; 
} 

E 'sempre meglio per evitare effetti collaterali, quando possibile. Possono causare problemi nel debug. Vedi this wikipedia article.

+0

Questo non funziona. Gli EE non cercano di ispezionare la funzione in alcun modo, si limitano a notare che non è una proprietà e l'etichetta come potenzialmente con effetti collaterali. – JaredPar

19

È possibile aggiungere ,ac all'espressione orologio di averlo aggiornare automaticamente il valore:

x.ToString(),ac 

Vedi MSDN per ulteriori informazioni e altri format specifiers.

Problemi correlati