67 votes

Drapeaux d'énumération sur 2^32

J'utilise des drapeaux Enum dans mon application. L'Enum peut avoir environ 50+ valeurs, donc les valeurs vont jusqu'à 2^50. Je me demandais si je pouvais utiliser Math.Pow(2, variable) pour les calculer ?

Quand j'essaie de faire ça, j'obtiens un valeur constante erreur de compilation. Existe-t-il un autre moyen, autre que de calculer manuellement ces puissances de 2 et de les intégrer ?

Voici ce que je fais :

[Flags]
internal enum RiskStates : long
    {
        None = 0,
        AL = Convert.ToInt64(Math.Pow(2,0)),
        AK = 2,
        AZ = 4,
        AR = 8,
        CA = 16,
        CO = 32,
        CT = 64,
        DC = 128,
        DE = 256,
        FL = 512,
        GA = 1024,
        HI = 2048,
        ID = 4096,
        IL = 8192,
        IN = 16384,
        IA = 32768,
        KS = 65536,
        KY = 131072,
        LA = 262144,
        ME = 524288,
        MD = 1048576,
        MA = 2097152,
        MI = 4194304
}

125voto

Jon Skeet Points 692016

Quand j'essaie de le faire, j'obtiens un valeur constante erreur de compilation.

En fait, ça irait bien si vous utilisiez la fonction L pour le forcer à être un long mais ce n'est toujours pas idéal de devoir les spécifier tous manuellement. (Ce n'est pas "évidemment correct" à la lecture du code).

Vous ne pouvez pas utiliser Math.Pow car l'expression doit être une constante de compilation - mais vous pouvez utiliser le décalage de bits :

None = 0,
AL = 1L << 0,
AK = 1L << 1,
AZ = 1L << 2

etc. Je dirais que c'est plus lisible de toute façon :)

9voto

Tom Points 8420

Vous pouvez utiliser des notations non décimales lorsque les puissances de 2 sont moins irrégulières :

// octal
AL = 0001L,
AK = 0002L,
AZ = 0004L,
AR = 0010L,
CA = 0020L,
CO = 0040L,
CT = 0100L,

// hexadecimal
AL = 0x001L,
AK = 0x002L,
AZ = 0x004L,
AR = 0x008L,
CA = 0x010L,
CO = 0x020L,
CT = 0x040L,

1voto

Refactor Points 324

Je serais tenté d'envisager d'utiliser BitArray comme structure sous-jacente.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X