2009-02-21 14 views
5

Ho visto diverse classi nel framework con questo comportamento (un simbolo di aggiornamento nella finestra di controllo e un avviso). È controllato da un Attributo? In tal caso, come posso emulare questo nella mia biblioteca?Esiste un attributo .Net per impedire la valutazione delle proprietà all'interno del debugger?

MODIFICA: Grazie per le informazioni! Per chiarire, sto sviluppando un framework con proprietà che devono accedere ai dati da un singolo thread. Sfortunatamente, sto avendo un comportamento strano quando sono nel debugger a causa delle finestre di controllo, ecc. Ho esperienza con l'attributo Debugger Browsable; tuttavia, preferirei visualizzare le proprietà dopo che il thread principale ha avuto accesso/impostato. Ho visto, specialmente in IEnumerables, che il debugger non valuterà senza l'input dell'utente. ... C'è un modo per contrassegnare queste proprietà come richiedenti "Valutazione implicita", oppure non posso avere la mia torta e mangiarla anch'io?

risposta

6

Questo non è controllato dagli attributi. È una caratteristica intrinseca del debugger.

Il motivo alla base di questa funzione è di impedire valutazioni di funzione indesiderate da parte dell'utente. Func Evals è un'operazione pericolosa nel debugger e può causare rallentamenti significativi o stato di programma corrotto. Il debugger si impegna a fare in modo che non esegua inavvertitamente evasioni di funzioni extra che potrebbero peggiorare la tua esperienza di debug.

Nel caso in cui vi sia un elemento nell'orologio/locals/finestra automatica che può causare una funzione e il debugger non crede che dovrebbe verificarsi una funzione, il valore si oscurerà e verrà visualizzato un pulsante di aggiornamento in la colonna del valore. Cliccando su quel pulsante si dice al debugger, "no davvero voglio valutare quell'espressione".

Ci sono molti motivi per cui questo accadrà nel debugger. Il seguente 2 è il più probabile.

implicita valutazione di proprietà è disattivata

Strumenti - > Debugger - > Opzioni - > Abilita implicito Proprietà valutazione

Se questo valore non è selezionata, si indica il debugger si prega di non auto-valutare proprietà. Le proprietà sotto il cofano sono solo chiamate di funzione. Sono generalmente più sicuri delle normali chiamate di funzione, ma non sempre.

Ma è comunque possibile forzare le proprietà da valutare digitandole direttamente nella finestra di controllo. Se si digita 2 di seguito, il primo valore diventerà "obsoleto". Questo perché digitando una seconda espressione nella finestra di controllo causerà una nuova valutazione di tutte le altre espressioni. Perché? Perché l'atto di valutare qualsiasi espressione avrebbe potuto alterare i risultati degli altri.

Poiché la funzione implicita è disattivata, la prima proprietà non verrà valutata automaticamente e sarà necessario forzarla.

Funz Kit e Passo

Se si aggiunge un'espressione per la finestra di controllo che fa una valutazione funzione e poi fare un passo il funzionamento, il valore sarà "staled" nella finestra di controllo.

Questo viene fatto per molte ragioni, una delle ragioni più importanti è il potenziamento delle prestazioni. È molto comune per un utente digitare molte espressioni nella finestra di controllo e non è raro avere una valutazione della funzione. Uno alla volta questi non sono molto lenti.Ma immagina che stai provando a passare velocemente attraverso un po 'di codice e hai avuto 10 errori di funzionamento nella finestra di controllo. Ciò può rapidamente sommarsi e degradare significativamente la tua esperienza di step. Pertanto le valutazioni funzionali non vengono rivalutate automaticamente.

+2

Ho rovinato alcune sessioni di debug spostando il mouse dove non dovevo e valutando le proprietà dei mock. Ciò ha gettato le aspettative che avevo creato attraverso la finestra. –

4

Mentre questo non genera l'icona di aggiornamento a cui ci si riferisce, un attributo molto utile è System.Diagnostics.DebuggerBrowsableAttribute, che consente di nascondere i campi da non mostrare mai in Watch windows. Ciò è utile quando i campi sono duplicati dagli accessor di proprietà e non è necessario che vengano visualizzati due volte, o se una proprietà esegue alcune operazioni sostanziali (come quello che stai suggerendo) e devi sopprimerla sempre in modo che il debugger non lo faccia valutarlo

1

Questo non è esattamente quello che si sta cercando, ma se si applica l'attributo [DebuggerStepThrough] al getter/setter della proprietà, si impedirà al debugger di rompere sulla proprietà se non si imposta esplicitamente un punto di interruzione sulla linea. Questo potrebbe essere utile se si desidera attendere e impostare il punto di interruzione dopo aver saputo che è sicuro valutare. Puoi anche usare [DebuggerHidden] se vuoi nasconderlo dal debug di tutti insieme.

Problemi correlati