15

DLL内のこの列挙型を想像してみてください。

public enum Colors
{
    Red,
    Green
}

列挙値を追加すると、バイナリ互換性が失われますか?変更した場合、既存のEXEは壊れますか?

public enum Colors
{
    Red,
    Green,
    Blue
}

私はこの答えを見ましたが、それは値を挿入する場合に対処しているようでした。最後だけに値を追加しても大丈夫ですか?

4

2 に答える 2

23

いいえ、列挙型は基本的に整数リテラル定数であるため、これによってバイナリ互換性が損なわれることはありません(アセンブリは引き続きロードされるなど)。真ん中に値を挿入することは明らかに本当に危険な考えですが、あなたはすでにそれを除外しています。

ただし、それはあなたが防ぐ必要がある他の多くの問題を引き起こす可能性があります:

  • 一部のコード(switch特にステートメント)は、新しい値を予期しない場合があります。技術的には、列挙型は値チェックされないため、これも以前は問題でした(列挙型変数には未定義の値が含まれる可能性があります)
  • 利用可能な列挙型を照会するものはすべて、異なる結果を取得します
    • 特に、特定のクライアントによってまだ予期されていない列挙型を使用するデータがある場合、シリアル化と逆シリアル化が予期せず失敗する可能性があります
于 2012-10-03T20:06:09.323 に答える
3

最後に追加するだけだとすれば、問題ないはずです。ただし、破損のリスクは、列挙値が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
}

これは、潜在的なバージョン管理の問題を防ぐのに役立ちます。

于 2012-10-03T20:16:26.440 に答える