Примечание простой пример ниже:Битовые операции - проверка и удаление
Module Module1
<Flags>
Public Enum Names
None = 0
Test = 1
Test2 = 2
Test3 = 4
Test4 = 8
End Enum
Sub Main()
Dim test As Names = Names.Test Or Names.Test3
If (test And Names.Test3) = Names.Test3
Console.WriteLine("TRUE")
Else
Console.WriteLine("FALSE")
End If
End Sub
End Module
Первая часть моего вопроса относится к линии If (test And Names.Test3) = Names.Test3
.
Не было бы лучше просто проверить If test And Names.Test3
, как если бы флаг существовал? Если он оценивает ненулевое значение (то есть флаг существует), то результатом этого условия будет True
в любом случае.
Есть ли веская причина использовать первый способ проверки второго? (Хотя мой ответ для VB.NET, мне также было бы интересно узнать, является ли это потенциальной ловушкой в другом месте, то есть C#, C++ и т. Д.).
Кроме того, в отношении удаления флага, кажется, есть два способа сделать это:
test = test Xor Names.Test3
и test = test And Not Names.Test3
Тем не менее, первый добавит флаг, если он отсутствует, и удалить его, если он там, тогда как второй удалит его только. Разве это единственная разница? Или есть еще одна причина, почему я должен предпочесть один метод другому?
Мы обычно только как 1 вопрос. Но для вашего второго, это разница для вашего дела. Это становится более сложным, когда вы начинаете комбинировать флаги (test Xor (Names.Test2 или Names.Test3). В этом случае Xor может создать странный результат, если у вас нет обоих флагов. –
Я понял, что мои вопросы были незначительными что они не должны быть разделены. Эта вещь «Xor», которую вы отметили, кажется мне такой же, как и ожидалось, она просто делает все сразу. В вашем примере она добавляет «Names.Test2», потому что ее нет, и удаляет 'Names.Test3', потому что он (уже существует)! – Interminable