FlagsAttribute для чего? - PullRequest
       8

FlagsAttribute для чего?

3 голосов
/ 12 февраля 2010

Какая разница между кодом ниже

' no Flags'
Public Enum MyEnum
  Monday = 1
  Tuesday = 2
  Wednesday = 4
  Thursday = 8
End Enum

и

<Flags()> _ 
Public Enum MyEnum
  Monday = 1
  Tuesday = 2
  Wednesday = 4
  Thursday = 8
End Enum

Я делаю

Dim days As MyEnum = MyEnum.Monday Or MyEnum.Tuesday Or MyEnum.Wednesday 

If (days And MyEnum.Tuesday) = MyEnum.Tuesday Then
  Console.WriteLine("Tuesday OK") ' here'
Else
  Console.WriteLine("Tuesday NOK")
End If

If (days And MyEnum.Thursday ) = MyEnum.Thursday Then
  Console.WriteLine("Thursday OK")
Else
  Console.WriteLine("Thursday NOK") ' here'
End If

и получить одинаковый результат в обоих случаях (с или без FlagAttribute).

Ответы [ 5 ]

5 голосов
/ 12 февраля 2010

По сути, он сообщает CLR, что значения перечисления могут быть объединены. Без этого атрибута объединение значений приведет к неизвестному значению (но оно все равно будет действительным). С атрибутом комбинация правильно интерпретируется

Без атрибутов Flags:

' Gives "Monday, Tuesday" '
Dim s As String = (MyEnum.Monday Or MyEnum.Tuesday).ToString() 

Без атрибутов Flags:

' Gives "3" '
Dim s As String = (MyEnum.Monday Or MyEnum.Tuesday).ToString() 
2 голосов
/ 12 февраля 2010

Это только влияет на ToString ()

0 голосов
/ 12 февраля 2010

Я не могу ответить с кодом VB, но флаги очень полезны при определенных обстоятельствах. Пример, который вы продемонстрировали, не так хорош. Представьте, что у вас есть что-то похожее на:

enum Format
{
  Bold = 1,
  Italic = 2,
  Underlined = 4
}

Тогда вы можете указать Format:

Format format = Format.Bold | Format.Italic;
// Then a check to see if the format is bold or italic should both pass.

Теперь это и полужирный и курсив (равно 3). Вы не сможете установить это без атрибута flags, хотя. Это как бы предотвращает взаимную исключительность опций. Чтобы сделать это без флагов, вам нужно сделать:

enum Format
{
  Bold,
  BoldUnderlined,
  BoldItalic,
  BoldUnderlinedItalic,  
  Underlined,  
  Italic,
  ItalicUnderlined
}

Не так близко, как приятно.

0 голосов
/ 12 февраля 2010
0 голосов
/ 12 февраля 2010

См. Ответ Томаса Левеска. Например, вы можете сделать:

switch (test.day)
{
    case MyEnum.Monday:
    {
        //something when its monday
    }
    break;
    case MyEnum.Tuesday:
    {
        //something when its tuesday
    }
    break;
    case MyEnum.Monday | MyEnum.Tuesday:
    {
        //something when its monday and tuesday (oh the irony)
    }
    break;
}       
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...