enum値を追加すると、バイナリ互換性を破ることができますか?
-
13-12-2019 - |
質問
この列挙体をDLLに想像してみてください。
public enum Colors
{
Red,
Green
}
.
enum値を追加してもバイナリ互換性を破る?私がそれを変えることになったら、存在するexes break?
public enum Colors
{
Red,
Green,
Blue
}
.
私はこの回答を見たが、値のの場合に対処するように見えた。に値を追加すると、のみ、そのOK?
解決
いいえ、列挙メントは基本的に整数リテラル定数であるため、これはバイナリ互換性を絶対に分割しません(アセンブリはまだロードされます)。途中で値を挿入することは明らかに本当に危険な考えですが、あなたはすでにそれを除外しています。
しかし、それに対抗する必要がある他の多くの問題を引き起こす可能性があります。
- 特定のコード(特に
switch
ステートメント)は、新しい値を予想していない可能性があります。技術的にこれは問題ではありませんでした、列挙体は値チェックされていない(enum変数には未定義の値を含めることができます) - 利用可能な列挙体を問い合わせるものは何でも異なる結果を得ることです
-
特定のクライアント
にまだ予想されていない列挙体を使用しているデータがある場合、 - は、シリアル化と逆シリアライゼーションが予期せずに失敗する可能性があります。
他のヒント
最後に追加するだけで、大丈夫です。しかし、破損するリスクは、列挙値が0から暗黙的に定義されているという事実から来るでしょう。
例として、列挙体を変更した場合:
public enum Colors
{
Blue,
Red,
Green
}
.
彼らのDBSにこれらの価値を保存した人は誰でも、赤いものが今青いものであることがわかり、緑は赤です。
理想的には、あなたの列挙体をそのように定義する必要があります。
public enum Colors
{
Red = 0,
Green = 1
}
.
それからあなたが新しいものを追加するとき、あなたは:
を持っているべきです。public enum Colors
{
Red = 0,
Green = 1,
Blue = 2
}
.
これはバージョン管理の潜在的な問題を防ぐのに役立ちます。
所属していません StackOverflow