Le 13 sconosciute (o quasi): cronache di funzionalità C# che pochi usano (e forse un motivo c’è) – Puntata 2

Reading Time: 2 minutes
extern alias – Quando vuoi 2 tipi == ma !=

extern alias – Quando vuoi 2 tipi == ma !=

Il dramma di nomenclatura

Ah, extern alias. Questa non è una funzionalità per tutti. È per gli sviluppatori che hanno ereditato un progetto con due DLL di terze parti (chiamiamole “LibraA” e “LibraB”) che, per un sadico scherzo del destino, contengono entrambe una classe chiamata SuperMegaDataProcessor.

“Perché non rinominarle?” chiederete voi, con l’ingenuità di un programmatore appena uscito dall’università. La risposta è: “Non si può!”. Magari sono librerie proprietarie, o siete bloccati in un inferno di compatibilità.

È qui che entra in gioco l’alias esterno. Non risolve il vostro problema di vita, ma almeno rende il compilatore un po’ meno schizofrenico. È come quando in una classe ci sono due ragazzi con lo stesso nome: non li chiami “Marco” e “Marco”, ma “Marco del Sud” e “Marco del Nord”. O, se sei su C#, “LibraA::SuperMegaDataProcessor” e “LibraB::SuperMegaDataProcessor”.

Citazione di Attualità (Musicale)

“Two roads diverged in a wood, and I—I took the one less traveled by, And that has made all the difference.” – Robert Frost (The Road Not Taken).

E in C# diciamo: “Due librerie con lo stesso nome si sono incrociate nel nostro progetto e abbiamo dovuto usare extern alias, e questo ha reso il nostro codice uno scherzo difficile da spiegare ai junior.”

Lo scontro dei Titani

Per usarlo, dovete prima dirlo al compilatore (spesso modificando il file .csproj o tramite le impostazioni dell’IDE, impostando un alias come LibraA sulla referenza della DLL):

C#

// 1. Dichiara che userai un alias esterno
extern alias LibraA; 
extern alias LibraB;

// 2. Usali con l'operatore '::'
public void ProcessTwoWorlds()
{
    // Usa il SuperMegaDataProcessor dalla LibraA
    LibraA::MyCompany.SuperMegaDataProcessor processorA = new(); 
    processorA.Process();

    // Usa il SuperMegaDataProcessor dalla LibraB
    LibraB::MyCompany.SuperMegaDataProcessor processorB = new(); 
    processorB.Process();
    
    // Senza alias, questo codice sarebbe un campo di battaglia.
}

L’unico modo per distinguere due gemelli identici. Utile? Sì. Elegante? Assolutamente no. Ma hey, a volte la programmazione è solo patchare le decisioni sbagliate del passato, come mettere una toppa su una maglia autografata da Michael Jordan.

Se questo articolo ti è piaciuto condividilo
Torna in alto