Domanda

Esistono simboli del preprocessore che consentono qualcosa di simile

#if CLR_AT_LEAST_3.5
// use ReaderWriterLockSlim
#else
// use ReaderWriterLock
#endif

o un altro modo per farlo?

È stato utile?

Soluzione

Non credo che ci siano simboli "preprocessore" predefiniti. Tuttavia puoi ottenere ciò che desideri in questo modo:

  1. Crea diverse configurazioni del tuo progetto, una per ogni versione di CLR che desideri supportare.

  2. Scegli un simbolo come VERSION2 , VERSION3 ecc. per versione CLR.

  3. In ogni configurazione, definire un simbolo associato ad esso e annullare la definizione di tutti gli altri.

  4. Usa questi simboli nei blocchi di compilazione condizionale.

Altri suggerimenti

Non è presente alcun built-in, ma è possibile fornire il proprio.

Per questo scenario specifico, potresti voler incapsulare la logica in (ad esempio) una classe wrapper (blocco), in modo da non avere #if sparsi in tutto il codice; ovviamente, se stai solo facendo un piccolo blocco, potrebbe non valere la pena.

Uso diverse configurazioni e / o progetti per creare una varietà di piattaforme, ad esempio protobuf- net costruisce per .NET 2.0, .NET 3.0, mono, CF 2.0, CF 3.5 usando questo trucco. Il codice ha blocchi #if basati su simboli diversi per controllare la logica - quindi, ad esempio, BinaryFormatter non è disponibile su CF, WCF è disponibile solo con .NET 3.0, Delegate.CreateDelegate non è su CF 2.0, ecc.

È possibile utilizzare reflection per verificare in modo dinamico se un determinato tipo come ReaderWriterLockSlim è disponibile (anziché utilizzare il preprocessore).

Questo ti darebbe il vantaggio di poter distribuire una singola versione del tuo prodotto e gli utenti che hanno (o aggiornano a) .NET 3.5 beneficeranno del codice ottimizzato.

È possibile impostare manualmente questo simbolo utilizzando / define switch di compilazione . Quindi si creano diverse configurazioni di build per ciascuna versione clr desiderata.

Se è tutto ciò che dovevi fare, suppongo che potresti utilizzare Environment.Version, ma come di divo , sembra lasciare un sacco di codice inutile lì.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top