2010-08-06 15 views
6

Betrachten Sie den folgenden Code ein:Ändert sich die Nummer einer Enum eine brechende Änderung?

public enum SomeCode 
{ 
    NIF = 0 
    ,NIE = 1 
    ,CIF = 2 
    ,PAS = 3 
    ,NIN = 4 
    ,SSN = 5 
    ,OTH = 5 
    ,UKN = 6 
} 

OTH = 5 zu OTH = 7 Würde Wechsel eine Bruch Veränderung?


Edit: Ich speichern nie den int-Wert, nur die Textdarstellung der enum. Es kann in anderen DLLs verwandt werden, aber wird denselben Speicher verwenden.

Antwort

12

Es ist eine bahnbrechende Änderung, da Sie eine öffentliche API ändern.

Bibliotheken/Anwendungen, die mit dem alten Wert erstellt wurden, behalten den alten Wert und verwenden ihn. Sie müssen sie alle neu kompilieren.

Von MSDN - enum (C# Reference):

Genau wie bei jedem konstant, alle Verweise auf die einzelnen Werte eines Aufzählungs werden bei der Kompilierung zu Zahlenliterale umgewandelt. Dies kann zu Problemen bei der Versionssteuerung führen, wie in Konstanten (C# -Programmierhandbuch) beschrieben.

+0

Danke dafür. Alle Informationen, die ich brauchte. – cjk

3

Es hängt davon ab, ob Sie die Kontrolle über den vollständigen Code für Ihre Lösung haben oder ob Sie eine Bibliothek exportieren, die von anderen verwendet werden soll.

  • Vielleicht nicht wenn alle der folgenden Bedingungen erfüllt sind
    • Wenn es nur für den eigenen Gebrauch ist
    • Sie alle wieder aufbauen
    • Sie nur die Aufzählung verwenden
    • Sie die Ordinalzahl nicht speichern, zu/von ihr werfen, in einer Datenbank persistieren.
  • Ja, wenn eine der folgenden Bedingungen erfüllt sind
    • Wenn jemand anderes Ihre Bibliothek verwendet und neu kompilieren nicht und verwendet keine versionsspezifischen Referenz (vorausgesetzt, Sie Erhöhen Sie Ihre Build-Version) oder eine signierte Referenz. Der andere Code wird seine eigene Kopie des Ordnungswerts gespeichert haben, der jetzt nicht übereinstimmt.
    • Sie verwenden explizite Casts gegen den Ordnungswert
    • Sie die Daten serialisiert und die alten „save-files“

Es gibt ähnliche gotchas mit öffentlich ausgesetzt consts verwenden möchten.

Im Allgemeinen annehmen, ja - es ist eine brechende Änderung!

+1

Es könnte immer noch eine bahnbrechende Veränderung sein, selbst wenn Sie der einzige Verbraucher sind. Wenn Sie irgendwo in Ihrem Code zwischen den int-Wert umwandeln, um den enum-Wert zu erhalten, könnte dies zu Ausnahmen oder (schlimmer) dem falschen Wert führen. Es ist beispielsweise nicht ungewöhnlich, Werte in einer Datenbank einer Enumeration zuzuordnen, indem der Primärschlüssel der Tabelle als Wert der Enumeration verwendet wird. –

2

Es wird. Angenommen, Sie speichern einige Daten als int aus der Enumeration, das Abrufen der Daten in der Zukunft führt zu falschen Ergebnissen. In diesem Fall werden Daten, die vor der Änderung für OTH gespeichert wurden, nicht als OTH angezeigt, da Sie derzeit 5 für OTH speichern. Sie erhalten 5 in der Zukunft und Sie benötigen 7 für dieselbe.

0

Erstens, beide SSN und OTH = 5, ist es Tippfehler, wie sonst ist es Kompilierzeit Fehler für eine Switch-Anweisung mit dieser Enumeration? Wenn Sie nun OTH = 5 in OTH = 7 ändern, würde dies eine Änderung bedeuten, wenn Sie enum als SomeCode someCode = (SomeCode)5 verwenden.

+0

Es ist kein Tippfehler, daher die Frage nach der Änderung. Es wird nie in einer Switch Statement verwendet, also kein Kompilierzeitfehler. – cjk

0

Kommt drauf an. Es ist eine nicht-brechende Änderung nur, wenn Sie verifizieren können, dass niemand davon abhängt, dass sein Wert 5 oder der gleiche wie SSN ist, oder wenn Sie eine solche Abhängigkeit umstrukturieren können.

2

Zwar ist es keine brechende Änderung, wenn niemand davon abhängt, dass der Wert 5 ist, aber es ist erwähnenswert, dass jeder, der es benutzt, davon abhängt, dass es 5 ist, auch wenn das in seinem Code nicht explizit ist.

Wenn ich Code gegen diese Baugruppe schreiben wie:

if(myVal == SomeCode.OTH) 
{ 
    //do something 
} 

Dann intern, dass es auf einen Wert von 5. Auch wenn die Zahl 5 nicht in meinem Quellcode erscheint überall vergleichen, so wird es break, wenn ich die neue Version der Assembly bereitstellen.

Die Rettung ist, dass ich nicht neu schreiben muss, um mit dieser brechenden Änderung umzugehen, einfach neu kompilieren.

Verwandte Themen