Pregunta

Imagine esta enumeración en una DLL.

public enum Colors
{
    Red,
    Green
}

¿Agregar valores de enumeración rompe la compatibilidad binaria?Si tuviera que cambiarlo, ¿se romperían los EXE existentes?

public enum Colors
{
    Red,
    Green,
    Blue
}

Yo vi esta respuesta, pero parecía abordar el caso de insertando un valor.Si agrego valores a solo el final, ¿Eso esta bien?

¿Fue útil?

Solución

No, esto no rompe la compatibilidad binaria (en la medida en que:el ensamblado aún se cargará, etc.), porque las enumeraciones son básicamente constantes literales enteras.Insertar valores en el medio es obviamente una idea realmente peligrosa, pero ya la has excluido.

Sin embargo, puede causar una serie de otros problemas contra los que debes protegerte:

  • algún código (switch declaraciones en particular) pueden no anticipar los nuevos valores;Técnicamente, esto también era un problema antes, ya que las enumeraciones no se verifican por valor (las variables de enumeración pueden contener valores indefinidos)
  • cualquier cosa que consulte las enumeraciones disponibles obtendrá resultados diferentes
    • en particular, la serialización y deserialización pueden fallar inesperadamente si hay datos que utilizan enumeraciones que aún no son esperados por el cliente en particular.

Otros consejos

Debería estar bien, suponiendo que solo agregue al final.Sin embargo, el riesgo de ruptura provendrá del hecho de que los valores de Enum se definen implícitamente, comenzando a 0. Entonces, si alguien persiste los valores a un DB, corre el riesgo de cambiar los valores que mapean.

como ejemplo, si cambió su enum para ser:

public enum Colors
{
    Blue,
    Red,
    Green
}

Cualquier persona que almacenaron estos valores en su DBS vería que las cosas que una vez fueron rojas, son ahora azules, y lo que era verde ahora es rojo.

Idealmente, debe definir su enum así:

public enum Colors
{
    Red = 0,
    Green = 1
}

y luego, cuando agrega una nueva, debe tener:

public enum Colors
{
    Red = 0,
    Green = 1,
    Blue = 2
}

Esto ayudará a prevenir cualquier problema de versiones potenciales.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top