У меня есть следующие enum
:Проблемы с Enum как Флаги
[Flags]
public enum Status { Nominal, Modified, DirOneOnly, DirTwoOnly, DirOneNewest, DirTwoNewest }
Я пытаюсь увидеть, был ли Modified
бит был установлен верно и попытался следующие методы:
if(_stateFlags.HasFlag(Status.Modified))
{
//DoStuff
} //Found out why this doesn't work after reading docs.
и
if((_stateFlags & Status.Modified) == Status.Modified)
{
//DoStuff
}
Последний метод, который мои дальнейшие исследования привели я полагаю, что это сработает. Однако, когда я делаю _stateFlags = Status.DirTwoOnly
, приведенное выше заявление все еще, кажется, оценивает true
, что действительно озадачивает меня.
Я делаю что-то принципиально неправильно?
Вы присвоили ему атрибут [Флаги], но перечисления не имеют однозначных значений. (int) Статус = 3 может быть DirTwoOnly или может быть номинальным | Modified. Вы должны их пронумеровать, чтобы они не перекрывали биты. Итак, 1, 2, 4, 8, 16 и т. Д. –
Спасибо @HansPassant Я предположил, что они дефолтны по силам двух. Виноват. –
Вы можете подумать о том, стоит ли определять вашу собственную структуру, которая по-прежнему занимает всего 4 байта, но имеет на ней собственные методы, такие как «IsModified» и т. Д. Необходимость выполнения битовой арифметики для определения ее значения делает код, который должен читать как семантика - «изменен статус?«- читайте больше как механизмы -« бит три из этого битового массива включен? » –