En C#, la sintaxis abreviada para instanciar objetos permite establecer propiedades directamente durante la creación, sin necesidad de un constructor explícito. Por ejemplo, consideremos una clase simple:
public class Empleado
{
public int Identificacion { get; set; }
public string Nombre { get; set; }
public string Enlace { get; set; }
}
Se puede instanciar y configurar en un solo paso:
var empleado = new Empleado{
Identificacion = 10,
Nombre = "Carlos",
Enlace = "http://ejemplo.com"
};
Esta azúcar sintáctico es equivalente a la instanciación tradicional:
var empleado = new Empleado();
empleado.Identificacion = 10;
empleado.Nombre = "Carlos";
empleado.Enlace = "http://ejemplo.com";
Sin embargo, al trabajar en entornos específicos como Unity, se pueden observar comportamientos no esperados. En un proyecto, definí una clase con una clase anidada:
class Contenedor
{
public class Elemento
{
public int clave = 1;
public bool habilitado = true;
}
public int indice;
}
Intenté instanciar y configurar la clase anidada usando la sintaxis abreviada:
Contenedor.Elemento elem = new Contenedor.Elemento(){
clave = 2,
habilitado = false
};
Al imprimir los valores, observé discrepancias. Realicé pruebas sistemáticas, con los siguientes hallazgos:
Resultados:
elem.clave => 2
elem.habilitado => true
Pruebas:
(1) Sin valor predeterminado para 'habilitado':
a. Al no establecerlo, el valor es false.
b. Al establecerlo a false, el valor es false.
c. Al establecerlo a true, el valor es true.
(2) Con valor predeterminado 'false':
a. Al no establecerlo, el valor es false.
b. Al establecerlo a false, el valor es false.
c. Al establecerlo a true, el valor es true.
(3) Con valor predeterminado 'true':
a. Al no establecerlo, el valor es true.
b. Al establecerlo a false, el valor es true (inesperado).
c. Al establecerlo a true, el valor es true.
El caso inesperado (marcado) ocurre cuando se intenta asignar 'false' a una propiedad con valor predeterminado 'true', ya que se esperaba que la sobrescritura funcionara. Este problema surgió específicamente en Unity 4.6.5 con el framework .NET 3.5 full base class libraries.
Para verificar, realicé la misma prueba en una aplicación de consola C# con .NET 4.0 Client Profile y .NET 3.5 Client Profile, donde no hubo anomalías. Sin embargo, en el entorno Unity, independientemente de la versión de .NET, el comportamiento persiste.
Por lo tanto, se debe tener precaución al usar la azúcar sintáctico en proyectos de Unity, ya que puede producir resultados inconsistentes.