Что означает, что флаги перечисляют значения, имеющие префикс 0x? - PullRequest
0 голосов
/ 06 ноября 2019

Я нашел это enum с атрибутом Flags:

    [Flags]
    public enum Technology
    {
       None = 0x0000,
        X1 = 0x0001,
        X2 = 0x0002,
        X3 = 0x0004,
        X4 = 0x0008,
        X5 = 0x0010,
        X6 = 0x0020,       
    }

Значения, присвоенные enum членам, что это за написание?

И будет ли этобыть одинаковыми ?

    [Flags]
    public enum Technology
    {
       None = 0,
        X1 = 1,
        X2 = 2,
        X3 = 4,
        X4 = 8,
        X5 = 10,
        X6 = 20,       
    }

Если да, то почему X5 не 16 в два раза больше значения X4, потому что эта логика происходит от X1 до X4!

Ответы [ 2 ]

4 голосов
/ 06 ноября 2019

Ну, 0x префикс означает шестнадцатеричный , а не просто десятичный . Таким образом, эквивалентные объявления будут

шестнадцатеричный (0x префикс)

[Flags]
public enum Technology
{
   None = 0x0000,
     X1 = 0x0001,
     X2 = 0x0002,
     X3 = 0x0004,
     X4 = 0x0008,
     X5 = 0x0010, // 0x0010 == 1 * 16 + 0 == 16
     X6 = 0x0020, // 0x0020 == 2 * 16 + 0 == 32       
}

десятичный

[Flags]
public enum Technology
{
   None =  0,
     X1 =  1,
     X2 =  2,
     X3 =  4,
     X4 =  8,
     X5 = 16,
     X6 = 32,       
}

двоичный (примечание 0b префикс)

[Flags]
public enum Technology
{
   None = 0b000000,
     X1 = 0b000001,
     X2 = 0b000010,
     X3 = 0b000100,
     X4 = 0b001000,
     X5 = 0b010000,
     X6 = 0b100000,       
}
3 голосов
/ 06 ноября 2019

0x0000 - это 0 в шестнадцатеричном формате. Это означает, что 0x0010 на самом деле 16 в десятичном виде - что делает элементы x5 и x6 обоих перечислений разными.

Чтобы сделать их одинаковыми, во втором enum вынужны значения 16 и 32 для x5 и x6.

Префикс 0x - это то, что сообщает компилятору c #, что значение является шестнадцатеричным - как описано в Integer Абзац литералов в целочисленных числовых типах (ссылка на C #) :

Целочисленные литералы могут быть

  • десятичные: без префикса
  • шестнадцатеричные: спрефикс 0x или 0X
  • двоичный: с префиксом 0b или 0B (доступно в C # 7.0 и более поздних версиях)
...