2011-07-31 11 views
7

Sembra che sarebbe ideale (in termini di leggibilità) utilizzare dire Debug.WriteLine per scrivere sull'output anziché su una tonnellata di istruzioni #if DEBUG.C# Le istruzioni di debug vengono compilate durante l'esecuzione in modalità di rilascio?

Quando il programma è compilato in modalità di rilascio, tutto il sovraccarico con lo Debug.WriteLine scompare come se non esistesse, o la funzione è ancora chiamata, ma nulla è fatto internamente?

Se è così, c'è un modo per ottenere questa funzionalità su una classe personalizzata, cioè una chiamata statica verrebbe compilata solo se siamo in modalità Debug?

risposta

14

Si chiama ConditionalAttribute ed è già lì: le chiamate Debug.WriteLine() vengono rimosse completamente quando si compila in modalità di rilascio.

si dichiara in questo modo:

[ConditionalAttribute("DEBUG")] 
public static void WriteLine(string message) 

Quindi tutte le chiamate ad essa vengono rimossi se il simbolo DEBUG non è dichiarato, per esempio, nella configurazione di default di una build di rilascio. (È possibile modificare i simboli del pre-processore definiti per diverse configurazioni di costruzione nelle proprietà del progetto.)

Lo stesso vale per (quasi?) Ogni metodo in Debug. In effetti, è anche la differenza principale tra i metodi Debug e Trace - Trace.

+2

Non una risposta, ma anche se non si conosceva l'attributo condizionale e si inserisce l'intero metodo in e #if debug, si otterrebbe l'ottimizzazione. http://stackoverflow.com/questions/11783/in-net-will-empty-method-calls-be-optimized-out –

+2

@mootinator: Beh, non è lo stesso. Con 'Coditional' tutto viene buttato fuori al momento della compilazione. Con il metodo vuoto, JITter deve ancora analizzare le cose in runtime, riducendo così le prestazioni. Non molto ma comunque. In questo modo, invece, JITter non vedrebbe mai questo metodo di chiamata. –

+0

Ricorda che se esegui qualche pazzesca concatenazione di stringhe prima di passarla a Debug.Write/WriteLine, la concatenazione di stringhe sarà inclusa nella build di rilascio. Se inserisci la tua logica di concatenazione all'interno della funzione, questa verrà eliminata. Quindi potresti fare la tua stringa concat in questo modo: Debug.WriteLine (DoHugeStringCalculation()); ..altrimenti puoi usare #if DEBUG attorno a tutto. –

Problemi correlati