Hoy me encontré con un error interesante que escribí. Tengo un conjunto de propiedades que se pueden establecer a través de un setter general. Estas propiedades pueden ser tipos de valores o tipos de referencia.Comparación de tipos de valores en caja
public void SetValue(TEnum property, object value)
{
if (_properties[ property ] != value)
{
// Only come here when the new value is different.
}
}
Al escribir una prueba unitaria para este método, descubrí que la condición siempre es cierta para los tipos de valores. No tardé mucho en descubrir que esto se debe a boxing/unboxing. No me llevó mucho tiempo, ya sea para ajustar el código a la siguiente:
public void SetValue(TEnum property, object value)
{
if (!_properties[ property ].Equals(value))
{
// Only come here when the new value is different.
}
}
Lo que pasa es que no estoy del todo satisfecho con esta solución. Me gustaría mantener una comparación de referencia simple, a menos que el valor esté enmarcado.
La solución actual en la que estoy pensando solo llama al Equals()
para los valores en caja. Hacer a check for a boxed values parece un poco exagerado. ¿No hay una manera más fácil?
Sin duda, si usted quiere diverso comportamiento para los valores encuadrados, ¿entonces vas a necesitar verificar si estás tratando con un valor encuadrado? – LukeH
Realiza una sobrecarga genérica de este método con el tipo T donde T: struct –
@lukas, no funcionará a menos que exista una diferencia mayor que simplemente la 'T' y una restricción. –