Símbolos de compilación condicional

Símbolos de compilación condicional

Voy a explicar qué son y cómo se utilizan los Símbolos de Compilación Condicional que tanto se emplean en Xamarin y en las Apps de Windows. Para los que no lo sepan, Xamarin es un framework para desarrollo de apliaciones móviles Cross-Platform en C#.

Qué son

Son unas etiquetas que describen las distintas plataformas compatibles con un proyecto Cross-Platform.

Cuándo usarlos

Es recomendable usarlos cuando sólo hay diferencias muy pequeñas entre las distintas plataformas y no merece la pena extraer una clase, proyecto o solución para cada plataforma.

Dónde se utilizan

En Xamarin

En Xamarin están disponibles los siguientes símbolos de compilación condicional: #if __IOS__ // Código específico para iOS #endif#if __ANDROID__ // Código específico para Android #endif#if __ANDROID_11__ // Código específico para Android 3.0 o posterior #endif

En soluciones que compartan código de distintas Windows Apps

#if WINDOWS_APP // Código para una Windows Store app #else // Código para una Windows Phone app #endif #if NETFX_CORE // Código para una Windows Store app. #else // Código para una Windows Phone Silverlight app*. #endif#if NETFX_CORE #if WINDOWS_APP // Código para una Windows Store app. #else // Código para una Windows Phone Store app. #endif #else // Código para una Windows Phone Silverlight app. #endif *Una aplicación Windows Phone Silverlight no es más que un Frank Einstein de una Aplicación en Windows Phone 8 con la posibilidad de acceder a nuevas características de las aplicaciones Windows Phone Store sin necesidad de modificer el código existente en Windows Phone 8.

Unos ejemplos

Tenéis un ejemplo muy bueno de uso de estos símbolos en la aplicación que ha hecho @Dachi y que está disponible en GitHub. Otro ejemplo con Xamarin que he utilizado bastante es el siguiente: Android, iOS y Windows Phone tienen distinto modo de acceder al directorio en el que guardar la base de datos. Gracias a los símbolos de compilación condicional podemos utilizar un sólo método para acceder a esta ruta. Una vez tenemos la ruta a la base de datos, las operaciones con Xamarin Forms se hacen igual para todas las plataformas usando la PCL de SQLite disponible en NuGet. string DatabasePath { get { var sqliteFilename = "geekytheoryDB.db3"; #if __IOS__ string documentsPath = Environment.GetFolderPath (Environment.SpecialFolder.Personal); // Documents folder string libraryPath = Path.Combine (documentsPath, "..", "Library"); // Library folder var path = Path.Combine(libraryPath, sqliteFilename); #else #if __ANDROID__ string documentsPath = Environment.GetFolderPath (Environment.SpecialFolder.Personal); // Documents folder var path = Path.Combine(documentsPath, sqliteFilename); #else // WinPhone var path = Path.Combine(ApplicationData.Current.LocalFolder.Path, sqliteFilename);; #endif return path; } }

Fuentes