Udostępnij za pośrednictwem


CA1027: Oznaczaj wyliczenia za pomocą FlagsAttribute

TypeName

MarkEnumsWithFlags

CheckId

CA1027

Kategoria

Microsoft.Design

Zmiana kluczowa

Niekluczowa

Przyczyna

Wartości publicznego wyliczenia są potęgami dwójki lub kombinacjami innych wartości, które są zdefiniowane w wyliczeniu, a atrybut FlagsAttribute jest nieobecny.Aby zmniejszyć fałszywe pozytywne wyniki, ta reguła nie zgłosi naruszenia dla wyliczeń, które mają ciągłe wartości.

Opis reguły

Wyliczenie to typ wartości, który definiuje zestaw powiązanych nazwanych stałych.Zastosuj FlagsAttribute do wyliczenia, gdy jego stałe nazwane mogą zostać sensownie połączone.Rozważmy na przykład wyliczenie dni tygodnia w aplikacji, która śledzi, które zasoby dnia są dostępne.Jeśli dostępność każdego zasobu jest kodowana przy użyciu wyliczenia, które ma FlagsAttribute dowolna kombinacja dni może być zareprezentowana.Bez atrybutu, może być reprezentowany tylko jeden dzień tygodnia.

Dla pól przechowujących łączone wyliczenia, wartości poszczególnego wyliczenia są traktowane jako grupy bitów w polu.Dlatego takie pola są czasami zwane polami bitowymi.Aby połączyć wartość wyliczenia w celu składowania jej w polu bitowym, należy użyć warunkowych operatorów typu Boolean.Aby przetestować pole bitowe, żeby określić czy wartość określonego wyliczenia określonego obecna, użyj logicznych operatorów typu Boolean.Dla pola bitowego, aby mogło poprawnie przechowywać i pobierać połączone wartości wyliczenia, każda wartość określona w wyliczeniu musi być potęgą dwójki.Jeśli nie, operatory logiczne typu Boolean nie będą w stanie wyodrębnić poszczególnych wartości wyliczenia przechowywanych w polu.

Jak naprawić naruszenia

Aby naprawić naruszenie tej zasady, dodaj FlagsAttribute do wyliczenia.

Kiedy pominąć ostrzeżenia

Ostrzeżenie od tej reguły należy pominąć, jeśli nie chcesz łączyć wartości wyliczenia.

Przykład

W poniższym przykładzie DaysEnumNeedsFlags jest wyliczeniem, które spełnia wymagania dotyczące korzystania z FlagsAttribute, ale nie posiada tego atrybutu.Wyliczenie ColorEnumShouldNotHaveFlag nie posiada wartości, które są potęgami dwójki, i niepoprawnie określa FlagsAttribute.To narusza regułę CA2217: Nie oznaczaj wyliczeń za pomocą FlagsAttribute.

using System;

namespace DesignLibrary
{
// Violates rule: MarkEnumsWithFlags. 

   public enum DaysEnumNeedsFlags 
   {
      None        = 0,
      Monday      = 1,
      Tuesday     = 2,
      Wednesday   = 4,
      Thursday    = 8,
      Friday      = 16,
      All         = Monday| Tuesday | Wednesday | Thursday | Friday
   }
   // Violates rule: DoNotMarkEnumsWithFlags.
   [FlagsAttribute]
   public enum ColorEnumShouldNotHaveFlag 
   {
      None        = 0,
      Red         = 1,
      Orange      = 3,
      Yellow      = 4
   }
}

Powiązane reguły

CA2217: Nie oznaczaj wyliczeń za pomocą FlagsAttribute

Zobacz też

Informacje

FlagsAttribute