2012-10-03 19 views
13

Imagina esta enumeración en una DLL.¿La adición de valores enum rompe la compatibilidad binaria?

public enum Colors 
{ 
    Red, 
    Green 
} 

¿La adición de valores enum rompe la compatibilidad binaria? Si tuviera que cambiarlo, ¿se romperían los EXEs existentes?

public enum Colors 
{ 
    Red, 
    Green, 
    Blue 
} 

vi this answer, pero parecía para abordar el caso de la inserción de un valor. Si agrego valores a al final solo, ¿está bien?

Respuesta

17

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

Sin embargo, puede causar una serie de otros problemas que deben protegerse contra:

  • algo de código (switch declaraciones en particular) no puede anticipar los nuevos valores; técnicamente esto era un problema antes de mucho, ya que las enumeraciones no son de valor comprobado (las variables de enumeración pueden contener valores no definidos)
  • nada que consulta las enumeraciones disponibles va a obtener resultados diferentes
    • , en particular, la serialización y deserialización pueden fallar de forma inesperada si hay datos usando las enumeraciones que aún no era esperado por el cliente en particular
+1

Impresionante. ¿Qué puedo hacer para resistir la rotura? Obviamente, si lo hiciera a mi manera, no estaría agregando enumeraciones, pero dadas las circunstancias, ¿cuál es la forma más segura de abordar esto? En el caso de las sentencias de conmutación (retruécano no intencionado), ¿la ranura 'default:' especificada lo endurecería contra los cambios? – TheBuzzSaw

+1

@TheBuzzSaw La mejor forma de resistir las roturas es no usar enums para nada que espere que no permanezca igual hasta el final de los tiempos. – Servy

+0

@Servy Estoy de acuerdo ... pero ya que estoy atascado con enumeraciones en este momento, ¿qué más tienes? ;) – TheBuzzSaw

3

que debería estar bien, suponiendo que sólo se anexa al final. Sin embargo, el riesgo de ruptura vendría del hecho de que los valores enum están definidos implícitamente, comenzando en 0. Entonces, si alguien persiste en los valores de un DB, corre el riesgo de cambiar los valores a los que se asigna.

A modo de ejemplo, si ha cambiado su enumeración a ser:

public enum Colors 
{ 
    Blue, 
    Red, 
    Green 
} 

Cualquiera que almacena estos valores en su DB daría cuenta de que las cosas que antes eran rojos, forman ahora azul, y lo que era verde es ahora Rojo.

Idealmente, usted debe definir su enumeración de este modo:

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

Y luego, cuando se agrega una nueva, usted debe tener:

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

Esto ayudará a prevenir posibles problemas de versiones .

+0

+1. Le daría un cheque verde también si pudiera. Esta es una manera inteligente de hacer las enumeraciones más robustas. – TheBuzzSaw

+0

Tenga en cuenta que las especificaciones especifican que, si no especifica ningún valor, comenzará en 0 e incrementará en uno para cada valor, por lo que no es como el entero de respaldo es un comportamiento indefinido para el primer caso. Usted puede simplemente agregar hasta el final. – Servy

+0

Correcto, pero tiene que agregarlo al final o se rompe. –

Cuestiones relacionadas