Durante lo sviluppo di applicazioni è usuale compilare ed eseguire il codice in modalità "Debug", in modo che sia possibile eseguire il debugging con Visual Studio e anche ricevere messaggi di dettagliati per gli eventuali errori.
E' altrettanto usuale inserire del codice che possa aiutarci a comprendere lo stato dell'applicazione durante la sua esecuzione, senza l'obbligo di inserire punti di interruzione nel debug con Visual Studio. Tra l'altro, ci sono alcuni casi in cui il passaggio dall'applicazione a Visual Studio invalida le nostre verifiche, come ad esempio il test relativo al focus di un controllo.
Tali codici possono diventare molto utili e altrettanto numerosi e, solitamente, andrebbero cancellati sia per evitare che siano eseguiti in produzione, sia che usino inutilmente delle risorse. Tuttavia l'operazione manuale di cancellazione prima della build può divenire tediosa e suscettibile di errori che possono compromettere la build stessa; inoltre, in caso di continuo sviluppo, non avere più tali codici o doverli reinserire può creare qualche disagio o perdite di tempo.
A questo frequente scenario, anzichè creare soluzioni personalizzate, può venire in aiuto la compilazione condizionale, in cui alcune istruzioni indicano la validità di un certo blocco di codice in fase di compilazione e possono influenzare quale codice deve essere compilato e quindi diventare parte dell'assembly.
I marcatori predefiniti, e più utilizzati, sono DEBUG e RELEASE, relativi, rispettivameante, alle modalità standard di compilazione predisposte dai template dei progetti di Visual Studio. Possiamo utilizzarli direttamente all'interno del codice in questo modo:
public IEnumerable GetErrors(string propertyName)
{
#if DEBUG
throw new NotImplementedException();
#elseif RELEASE
//...
#endif
}Qualora si abbia la necessità, possiamo decorare direttamente i metodi con l'attributo Conditional:
[Conditional("DEBUG")]
public IEnumerable GetErrors()
{
throw new NotImplementedException();
}in modo che la loro esecuzione sia vincolata alla modalità di compilazione.
La compilazione condizionale è molto versatile ed i relativi marcatori possono essere personalizzati; ad esempio, i template dei progetti Silverlight aggiungono il marcatore "SILVERLIGHT", in modo da consentirci di vincolare l'esecuzione di alcune porzioni di codice solo nel caso in cui siano eseguite all'interno del plugin. Questo può risultare molto utile nel caso di sviluppo di una libreria che debba essere condivisa anche in progetti WPF, ma il cui codice debba presentare delle accortezze per essere compatibile anche con Silverlight.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Enterprise Live Migrations - Migrare da Azure DevOps a GitHub
Gestione del system path nei workflow di GitHub
Utilizzare le direttive più importanti in una file based app .NET
Gestione opzioni colonna nella Blazor QuickGrid
Creare un indice su una colonna JSON in SQL Server
Creare un extension method per applicare condizionalmente una Where in una query LINQ per Entity Framework
How to be a DevOps engineer in the AI era
Permettere a un LLM di invocare funzioni con Microsoft.Extensions.AI
Self-healing degli unit test con Copilot in GitHub
Sfruttare le regular expression in SQL Server 2025: la funzione REGEXP_LIKE
Abilitare .NET 10 su Azure App Service e Azure Functions
GitHub Quick Review per la valutazione dello stato di compliance dell'organizzazione aziendale


