2012-11-26 8 views
9

Normalnie przy porównywaniu teksty stałe flagi używam następujący format:Który jest lepszy sposób na porównanie Flags Enum?

(value & flag) == flag; 

Ale czasami natknąć się następująco:

(value & flag) != 0; 

prostu zastanawiasz się, co jest lepsze w użyciu, czy też sprowadzają się do osobistych pierwszeństwo?

+1

Wymieniłem użycie dowolnego z nich (w tym 'Enum.HasFlag') z oddzielnymi metodami pomocniczymi, które zapewniają znacznie czystsze korzystanie z interfejsu API i zmniejszają duplikowanie kodu. Zobacz: http://hugoware.net/blog/enumeration-extensions-2-0 Odkąd zacząłem używać modyfikacji rozszerzeń Hugo, sprawy wyglądają o wiele ładniej. :) –

Odpowiedz

10

Dopóki flag jest jedno- bitowa, są one równoważne. Jeśli flag ma wiele bitów,

(value & flag) == flag; 

jest logiczną AND (wszystkie bity muszą dopasowywać) podczas

(value & flag) != 0; 

jest logiczną OR (wszystkie bity muszą dopasowywać).

4

To tylko o osobistych preferencji.

Wydajność obu będzie w przybliżeniu taka sama, a wynik zawsze będzie identyczny. (Zakładając środowisko z pojedynczym gwintem).

Drugi przykład kopiowania/wklejania jest łatwiejszy do odgadnięcia.

Drugi przykład jest również nieco mniej podatny na problemy z przewlekaniem wątków (jeśli flag jest zmutowany w środku wyrażenia, które dziwne rzeczy mogą się zdarzyć w pierwszym).

16

jeśli używasz .NET 4 lub nowszy korzystanie Enum.HasFlag zamiast

W rzeczywistości metoda ta wykorzystuje pierwszy sposób sprawdzania, ale zapewniają bardziej wyraźny sposób na sprawdzenie flagi

+0

Który jest wolniejszy niż powyższe operacje! –

+1

Tak, to może być wolniejsze, ale w większości przypadków nie ma sensu, jeśli spojrzymy z punktu vs. widok wydajność jasny kod –

+0

Należy zauważyć, że metoda ta jest równoważna z pierwszej linii w oryginalnym Post. Jeżeli "flaga" nie jest wartością jednobitową (tj. Nie jest potęgą 2 lub "wartością minimalną" dla podpisanej liczby całkowitej zależnej), jest to ważne (patrz inne odpowiedzi). –

2

Jeśli sprawdzanie wartości z kompozytu flagą, jak na przykład wartości: 0x0111, flagi: 0x0101 następnie (value & flags) == flags oznacza „wszystkie flagi są ustawione” i (value & flags) != 0 oznacza „dowolny znacznik jest ustawiony”.

+0

Wznowiono, ale powinieneś edytować, aby umieścić potrzebne nawiasy. –

Powiązane problemy