Le direttive del compilatore sono risolte al momento della compilazione, la configurazione no. Quindi è più su ciò che è necessario per uscire da esso. Devi essere in grado di modificare la configurazione senza ricompilare?
Immagina di avere una connessione con un database nel tuo codice. Non si desidera connettersi al database di produzione durante lo sviluppo o il test. È possibile utilizzare la direttiva del compilatore di debug per accertarsi di connettersi automaticamente al database di test durante l'esecuzione in modalità di debug.
In un'altra istanza si modifica la posizione del database o le impostazioni di connessione. Ora l'applicazione in esecuzione non si connette più ad essa. È necessario modificare la stringa di connessione nel codice e ricompilarlo per farlo funzionare. Questo è quando vuoi che sia nel file di configurazione.
Puoi anche fare entrambe le cose. Sulla base di una direttiva del compilatore, si recupera la stringa di debug o di produzione dalla configurazione.
Se segui questa strada, ci sono altre cose da considerare. Avere direttive del compilatore su tutto il tuo codice è brutto (opinione). Un design migliore sarebbe utilizzare l'iniezione di dipendenza per risolvere questa connessione. Di solito ho un'interfaccia IEnvironmentSettings e molteplici implementazioni per scopi diversi, pungolo, test, test unitari.
Un'altra cosa che devi considerare è che le configurazioni sono testo normale. La stringa di connessione potrebbe contenere una password, che sarà leggibile da chiunque abbia accesso alla tua applicazione. Questo non è un problema con un server, ma è per le applicazioni client. Potresti voler crittografare la configurazione in queste istanze o lasciare le informazioni sensibili nel codice, puoi facilmente decompilare. Eseguibile netto, quindi non è perfettamente sicuro neanche.
Suppongo che tu debba decidere cosa vuoi ottenere dal refactoring del tuo codice.