2012-10-03 10 views
13

DLLでこの列挙型を想像してみてください。enum値を追加するとバイナリ互換性が損なわれますか?

public enum Colors 
{ 
    Red, 
    Green 
} 

2進数の互換性が損なわれますか?私がそれを変更すると、既存のEXEが壊れますか?

public enum Colors 
{ 
    Red, 
    Green, 
    Blue 
} 

私はthis answerを見ましたが、値を挿入した場合に対処するように見えました。 に値を追加すると、最後にと表示されます。これは問題ありませんか?

答えて

17

いいえ、enumは基本的に整数リテラル定数なので、バイナリ互換性は損なわれません(アセンブリの読み込みなど)。真ん中に値を挿入することは明らかに危険なアイデアですが、すでに除外しています。

しかし、それはあなたが警戒する必要がある他の多くの問題が発生することができます

  • いくつかのコード(特にswitch文は)新しい値を予想しないかもしれません。列挙型の値がチェックさ(列挙型の変数が未定義の値を含めることができます)
  • 可能な列挙型を照会
  • 何が違うの結果、特に
    • を取得するために起こっているではありませんので、技術的には、これはあまりにも前に問題があった、シリアライズとデシリアライズに失敗することがありますまだ特定のクライアントによって期待されていない列挙型
+1

驚くばかりです。破損に抵抗するために私は何ができますか?明らかに、もし私が自分のやり方を持っていれば、私は列挙型を追加しないだろうが、状況を考えれば、これに最も安全にアプローチする方法は何か? switch文(意図しないpun)の場合、 'default:'スロットが指定されていれば、それはまったく変更されません。 – TheBuzzSaw

+1

@ TheBuzzSaw破損に抵抗する最良の方法は、時間の終わりまで同じではないと予想されるものについて列挙を使用しないことです。 – Servy

+0

@Servy合意しました...しかし、私は現在列挙型に固執しているので、他に何がありますか? ;) – TheBuzzSaw

3

を使用してデータがある予期せず場合、それはあなたが唯一の最後に追加仮定し、問題ないはずです。しかし、破損する危険性は、enum値が暗黙的に0から始まるという事実から来るでしょう。だから誰かがDBに値を永続させていると、どの値にマップするかを変更するリスクがあります。一例として、

は、あなたがあるためにあなたの列挙型を変更した場合:

public enum Colors 
{ 
    Blue, 
    Red, 
    Green 
} 

自分のDBでこれらの値を格納し誰もが一度赤だったものが、今やブルーであることがわかり、そしてどのようなグリーンは今してしまいます赤。

理想的には、あなたがそうのようなあなたの列挙型を定義する必要があります:あなたは新しいものを追加するときに、あなたが持っている必要があり、その後、

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

そして:

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

これは、任意の潜在的なバージョン管理の問題を防ぐことができます。

+0

+1。もし私ができるなら、私はこれも緑色のチェックを与えるだろう。これは列挙型を頑丈にする賢い方法です。 – TheBuzzSaw

+0

仕様には、値を指定しないと、0から始まり、値ごとに1ずつ増えるため、最初のケースの未定義の振る舞いとは異なります。あなたはちょうど最後に追加することができます。 – Servy

+0

そうですが、最後に追加する必要があります。 –

関連する問題