Question

Imaginez cette énumération dans une DLL.

public enum Colors
{
    Red,
    Green
}

L'ajout de valeurs d'énumération rompt-il la compatibilité binaire ?Si je devais le modifier, les fichiers EXE existants seraient-ils cassés ?

public enum Colors
{
    Red,
    Green,
    Blue
}

J'ai vu cette réponse, mais il semble aborder le cas de insertion une valeur.Si j'ajoute des valeurs à la fin seulement, est-ce que ça va ?

Était-ce utile?

La solution

Non, cela ne rompt pas la compatibilité binaire (dans la mesure où :l'assembly sera toujours chargé, etc.), car les énumérations sont essentiellement des constantes littérales entières.Insérer des valeurs au milieu est évidemment une idée très dangereuse, mais vous l'avez déjà exclu.

Cependant, cela peut entraîner un certain nombre d’autres problèmes contre lesquels vous devez vous prémunir :

  • du code (switch déclarations en particulier) peuvent ne pas anticiper les nouvelles valeurs ;techniquement, c'était également un problème auparavant, car les énumérations ne sont pas vérifiées (les variables d'énumération peuvent contenir des valeurs non définies)
  • tout ce qui interroge les énumérations disponibles obtiendra des résultats différents
    • en particulier, la sérialisation et la désérialisation peuvent échouer de manière inattendue s'il existe des données utilisant des énumérations qui ne sont pas encore attendues par le client particulier.

Autres conseils

Ça devrait aller bien, en supposant que vous ne faites que ajouter à la fin.Toutefois, le risque de rupture résulterait du fait que les valeurs d'enum sont définies implicitement, à partir de 0. Donc, si une personne persiste les valeurs à une DB, vous risquez de changer les valeurs qu'ils correspondent.

Par exemple, si vous avez changé votre énumé pour être:

public enum Colors
{
    Blue,
    Red,
    Green
}

Quiconque stocké ces valeurs dans leur DBS verrait que des choses qui étaient autrefois rouges, sont maintenant bleues et ce qui était vert est maintenant rouge.

Idéalement, vous devez définir votre énum comme suit:

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

Et puis, lorsque vous en ajoutez un nouveau, vous devriez avoir:

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

Cela aidera à prévenir les problèmes de versions potentiels.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top