0Pricing
C# Academy · Урок

Перечисления-флаги и побитовые комбинации

Объединяйте значения перечисления с атрибутом Flags.

«Перечисления-флаги и побитовые комбинации» — бесплатный урок C# Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.

Перечисления флагов

Перечисление флагов представляет сочетание параметров. Пометьте его атрибутом [Flags] и назначьте каждому элементу отдельную степень двойки.

using System;

[Flags]
enum Access { None = 0, Read = 1, Write = 2, Execute = 4 }
class Program {
    static void Main() {
        Access a = Access.Read | Access.Write;
        Console.WriteLine(a);
    }
}

Степени двойки

Каждый флаг должен занимать уникальный бит: 1, 2, 4, 8, 16. Благодаря этому значения можно объединять без перекрытия.

using System;

[Flags]
enum Perm { Read = 1, Write = 2, Delete = 4, Share = 8 }
class Program {
    static void Main() {
        Console.WriteLine((int)Perm.Share);
    }
}

Объединение с помощью OR

Используйте побитовый OR (|), чтобы объединить флаги в одно значение.

using System;

[Flags]
enum Access { None = 0, Read = 1, Write = 2, Execute = 4 }
class Program {
    static void Main() {
        Access a = Access.Read | Access.Execute;
        Console.WriteLine((int)a);
    }
}

Проверка с помощью HasFlag

HasFlag проверяет, содержит ли составное значение определённый флаг.

using System;

[Flags]
enum Access { None = 0, Read = 1, Write = 2, Execute = 4 }
class Program {
    static void Main() {
        Access a = Access.Read | Access.Write;
        Console.WriteLine(a.HasFlag(Access.Write));
        Console.WriteLine(a.HasFlag(Access.Execute));
    }
}

Проверка с помощью побитового AND

Также можно проверить флаг с помощью & и сравнить результат с ненулевым значением. Такой способ быстр и однозначен.

using System;

[Flags]
enum Access { None = 0, Read = 1, Write = 2 }
class Program {
    static void Main() {
        Access a = Access.Read | Access.Write;
        bool canWrite = (a & Access.Write) != 0;
        Console.WriteLine(canWrite);
    }
}

Удаление флага

Сбросьте флаг, применив AND к дополнению: a &= ~Access.Write.

using System;

[Flags]
enum Access { None = 0, Read = 1, Write = 2, Execute = 4 }
class Program {
    static void Main() {
        Access a = Access.Read | Access.Write;
        a &= ~Access.Write;
        Console.WriteLine(a);
    }
}

Добавление флага

Добавьте флаг с помощью OR. Если он уже присутствует, ничего не изменится.

using System;

[Flags]
enum Access { None = 0, Read = 1, Write = 2, Execute = 4 }
class Program {
    static void Main() {
        Access a = Access.Read;
        a |= Access.Execute;
        Console.WriteLine(a);
    }
}

Переключение флага

XOR (^) за один шаг меняет состояние флага с включённого на выключенное или наоборот.

using System;

[Flags]
enum Access { None = 0, Read = 1, Write = 2 }
class Program {
    static void Main() {
        Access a = Access.Read;
        a ^= Access.Write;
        Console.WriteLine(a);
        a ^= Access.Write;
        Console.WriteLine(a);
    }
}

Зачем нужен атрибут [Flags]

Атрибут [Flags] изменяет работу ToString, чтобы тот выводил объединённые имена, а не одно число.

using System;

[Flags]
enum Access { None = 0, Read = 1, Write = 2, Execute = 4 }
class Program {
    static void Main() {
        Access a = Access.Read | Access.Execute;
        Console.WriteLine(a);
    }
}

Определение объединённых элементов

Можно определить удобные элементы, являющиеся комбинациями, например All.

using System;

[Flags]
enum Access { None = 0, Read = 1, Write = 2, Execute = 4, All = Read | Write | Execute }
class Program {
    static void Main() {
        Console.WriteLine((int)Access.All);
    }
}

Флаги на практике

Флаги позволяют компактно представить разрешения, переключатели возможностей и наборы параметров в одном целом числе.

using System;

[Flags]
enum Feature { None = 0, Dark = 1, Beta = 2, Sync = 4 }
class Program {
    static void Main() {
        Feature f = Feature.Dark | Feature.Sync;
        Console.WriteLine(f.HasFlag(Feature.Beta));
    }
}

Быстрая проверка

Проверьте, насколько хорошо Вы понимаете перечисления флагов.

Итоги

В перечислении [Flags] каждому элементу назначается отдельная степень двойки, поэтому флаги объединяются с помощью |, а проверяются с помощью HasFlag или &. Добавляйте их с помощью |=, удаляйте с помощью &= ~, а переключайте с помощью ^=.

Атрибут заставляет ToString выводить объединённые имена, а также позволяет определять удобные элементы, например All.

Часто задаваемые вопросы

Урок «Перечисления-флаги и побитовые комбинации» бесплатный?

Да — полный текст урока «Перечисления-флаги и побитовые комбинации» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.

Чему я научусь в уроке «Перечисления-флаги и побитовые комбинации»?

Объединяйте значения перечисления с атрибутом Flags. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C# Academy?

Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Перечисления-флаги и побитовые комбинации»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C# Academy?

Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Определение и использование перечислений
  2. Перечисления-флаги и побитовые комбинации
  3. Преобразование и разбор перечислений
  4. Перебор значений перечисления
← Назад к C# Academy