.NET 9, Microsoft ha introducido un nuevo mecanismo de «feature switches» que permite incluir o excluir funcionalidades específicas en una aplicación de manera condicional. Esta capacidad es particularmente útil para optimizar el tamaño y rendimiento de las aplicaciones, especialmente cuando se utilizan técnicas como el «trimming» o la compilación AOT (Ahead-of-Time).
Esto se logra mediante nuevos atributos:
FeatureSwitchDefinitionAttribute
Este atributo permite que una propiedad de feature switch sea tratada como una constante durante el proceso de trimming.
Esto significa que cualquier código protegido por este switch puede ser eliminado si la característica está deshabilitada.
using System;
public class Feature
{
[FeatureSwitchDefinition("Feature.IsSupported")]
internal static bool IsSupported =>
AppContext.TryGetSwitch("Feature.IsSupported", out bool isEnabled) ? isEnabled : true;
internal static void Enable()
{
Console.WriteLine("Hello World");
}
}
public class Program
{
public static void Main()
{
if (Feature.IsSupported)
{
Feature.Enable();
}
}
}
En este ejemplo, si Feature.IsSupported
se establece en false
, el método Feature.Enable()
se excluye del build final.
FeatureGuardAttribute
Este atributo designa una propiedad de feature switch como guardián para el código anotado con atributos como RequiresUnreferencedCodeAttribute
. Esto asegura que el código protegido solo se incluya si la característica es compatible.
using System;
using System.Runtime.CompilerServices;
public class Feature
{
[FeatureGuard(typeof(RequiresDynamicCodeAttribute))]
internal static bool IsSupported => RuntimeFeature.IsDynamicCodeSupported;
[RequiresDynamicCode("Feature requires dynamic code support.")]
internal static void Implementation()
{
// Implementación específica de la característica
Console.WriteLine("Feature implementation is running.");
}
}
public class Program
{
public static void Main()
{
if (Feature.IsSupported)
{
Feature.Implementation();
}
else
{
Console.WriteLine("Dynamic code support is not available.");
}
}
}
Añaelo a tu proyecto
Para utilizar los feature switches, puedes definirlos en tu archivo de proyecto (.csproj) de la siguiente manera:
<ItemGroup>
<RuntimeHostConfigurationOption Include="Feature.IsSupported" Value="false" Trim="true" />
</ItemGroup>
Establecer Value
en false
indica que la característica no es compatible, lo que provoca que el proceso de trimming excluya el código asociado.
Beneficios de los Feature Switches
- Reducir el Tamaño de la Aplicación: Excluir código innecesario, lo que lleva a binarios más pequeños.
- Mejorar el Rendimiento: Minimizar el tamaño de la aplicación resulta en tiempos de carga más rápidos y mayor eficiencia.
- Personalizar Builds: Adaptar la aplicación para incluir solo las características necesarias, alineándola con escenarios de despliegue específicos.