Почему нет Enum.SetFlag, как есть Enum.HasFlag?
HasFlag
в качестве побитовой операции требовалась более сложная логика и повторение одного и того же флага дважды
myFlagsVariable= ((myFlagsVariable & MyFlagsEnum.MyFlag) ==MyFlagsEnum.MyFlag );
поэтому MS решила это реализовать.
SetFlag и ClearFlag лаконичны в C #
flags |= flag;// SetFlag
flags &= ~flag; // ClearFlag
но, к сожалению, не интуитивно. Каждый раз, когда мне нужно установить (или снять) флаг, я трачу несколько секунд (или минут), чтобы подумать: как называется метод? Почему это не показано в intellisense? Или нет, я должен использовать побитовые операции. Обратите внимание, что некоторые разработчики также спросят: что такое побитовая операция?
Если будут созданы расширения SetFlag и ClearFlag - ДА появиться в intellisense.
Следует ли разработчикам использовать расширения SetFlag и ClearFlag - НЕТ, потому что они неэффективны.
Мы создали расширения в классе нашей библиотеки EnumFlagsHelper, как в
SomeEnumHelperMethodsThatMakeDoingWhatYouWantEasier , но назвали функцию как SetFlag вместо Include и ClearFlag вместо Remove.
В теле методов SetFlag (и в итоговом комментарии) я решил добавить
Debug.Assert( false, " do not use the extension due to performance reason, use bitwise operation with the explanatory comment instead \n
flags |= flag;// SetFlag")
и аналогичное сообщение должно быть добавлено в ClearFlag
Debug.Assert( false, " do not use the extension due to performance reason, use bitwise operation with the explanatory comment instead \n
flags &= ~flag; // ClearFlag ")