2012-10-03 7 views
13

Stellen Sie sich diese Enumeration in einer DLL vor.Schadet das Hinzufügen von Enum-Werten die Binärkompatibilität?

public enum Colors 
{ 
    Red, 
    Green 
} 

Wird die Binärkompatibilität durch Hinzufügen von Enum-Werten beeinträchtigt? Wenn ich es ändern würde, würden bestehende EXEs brechen?

public enum Colors 
{ 
    Red, 
    Green, 
    Blue 
} 

Ich sah this answer, aber es schien den Fall Einfügen ein Wert zu adressieren. Wenn ich Werte das Ende nur hinzufügen, ist das OK?

Antwort

17

Nein, dies bricht die Binärkompatibilität nicht (insofern: die Assembly wird immer noch geladen usw.), weil Enums im Grunde genommen ganzzahlige Literalkonstanten sind. Das Einfügen von Werten in der Mitte ist offensichtlich eine sehr gefährliche Idee, aber Sie haben das bereits ausgeschlossen.

Es kann jedoch eine Reihe anderer Probleme verursachen, die Sie benötigen, um gegen:

  • einige Code (switch Aussagen insbesondere) können nicht die neuen Werte antizipieren; technisch dies ein Problem, bevor auch war, da Aufzählungen nicht wert geprüft sind (Enum Variablen undefinierte Werte enthalten kann)
  • alles, was die verfügbaren Aufzählungen abfragt wird unterschiedliche Ergebnisse
    • insbesondere bekommen, Serialisierung und Deserialisierung fehlschlagen unerwartet, wenn es Daten Aufzählungen verwenden, die von den jeweiligen Kunden noch nicht zu erwarten sind
+1

Ehrfürchtig. Was kann ich gegen Bruch tun? Offensichtlich würde ich, wenn ich es auf meine Art hätte, nicht an Enums hängen, aber was ist der sicherste Weg, dies zu tun, angesichts der Umstände? Im Falle von switch-Anweisungen (Wortspiel unbeabsichtigt), würde die Angabe des 'default:' Slots es gegen Änderungen überhaupt verhärten? – TheBuzzSaw

+1

@TheBuzzSaw Der beste Weg, Brüchen zu widerstehen, besteht darin, keine Enums für etwas zu verwenden, von dem man erwartet, dass es bis zum Ende der Zeit nicht dasselbe bleibt. – Servy

+0

@Servy Einverstanden ... aber da ich gerade mit enums festhalte, was hast du sonst noch? ;) – TheBuzzSaw

3

Es sollte in Ordnung sein, vorausgesetzt, nur Sie an das Ende anhängen. Das Risiko des Brechens würde jedoch von der Tatsache herrühren, dass die Enum-Werte implizit definiert sind und bei 0 beginnen. Wenn also jemand die Werte in einer DB festhält, riskiert man, die Werte zu ändern, denen sie zugeordnet sind.

Als Beispiel, wenn Sie Ihre Enum geändert werden:

public enum Colors 
{ 
    Blue, 
    Red, 
    Green 
} 

Wer diese Werte in ihrem DBs gespeichert würden sehen, dass die Dinge, die einst rot waren, sind jetzt Blau und Grün, was jetzt war, ist Rot.

Idealerweise sollten Sie Ihre Enum wie so definieren:

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

Und dann, wenn Sie eine neue hinzufügen, sollten Sie haben:

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

Dieses mögliche Versionierung verhindern helfen Probleme .

+0

+1. Ich würde auch einen grünen Scheck geben, wenn ich könnte. Dies ist eine clevere Möglichkeit, die Enums stabiler zu machen. – TheBuzzSaw

+0

Beachten Sie, dass die Spezifikationen speziell festlegen, dass bei Angabe von Werten der Wert bei 0 beginnt und bei jedem Wert um eins erhöht wird. Daher ist die Backing-Ganzzahl im ersten Fall nicht definiert. Sie können nur bis zum Ende hinzufügen. – Servy

+0

Richtig, aber Sie müssen es am Ende hinzufügen, sonst bricht es. –

Verwandte Themen