Страницы

воскресенье, 9 июня 2013 г.

Enum extension методы для Flag enum

Тип данные enum меняет свое поведение при добавление атрибута [Flags], и позволяет использовать enum в виде битовой маски. Но к сожалению, в стандарте присутствует всего один метод работы c такими enum, а именно HasFlag - производящий проверку установлены или нет соответствующие биты.

На самом деле не хватает нескольких методов, а именно:
Установка значения
Очистка значения
Реверс значения

Небольшое отступление, для описание Flag enum удобнее использовать следующую запись
Значение None - является сильно рекомендованным, но не обязательным. И вместо того, что бы считать степени двойки удобней использовать запись со сдвигом.

Конечно, никто не мешает, по необходимости, писать битовые выражения для произведения операций.
Но их надо помнить, а когда такие действия выполняются редко, то приходится тратить время, на то чтобы вспомнить подробности. Поэтому гораздо удобнее оформить данную логику в качестве extension методов.
Из-за того, что с типом данных enum производить бинарные операции невозможно, то extension методы приходится оформлять как generic и использовать reflection. Поэтому если нужна максимальная скорость выполнения операция (ну очень большая), то лучше использовать прямое написание, если нужна читаемость и сопровождаемость кода, то лучше использовать extension методы.

Комментариев нет :

Отправить комментарий