Pull to refresh

«Множества» в C#

Reading time3 min
Views14K
Снова пишу про то, что, в общем-то, известно =) Но если где-то нужно передать в качестве аргумента функции несколько флагов, то данный способ можно использовать. Множеств (UPD: не как классов в библиотеке .Net, а как встроенной в синтаксис языка конструкции) в C# нет. Но зато есть атрибут [FlagsAttribute] для перечислений (т.е. для enum'ов):
[Flags]<br>enum Magic<br>{<br>  None = 0,<br><br>  Fire = 1, //огонь<br>  Air  = 2, //воздух<br>  Water = 4, //вода<br>  Earth = 8, //земля<br><br>  All  = Fire | Air | Water | Earth<br>}<br><br>* This source code was highlighted with Source Code Highlighter.
Просто приведу пример:
class Program<br>{<br>  //перечисление<br>  [Flags]<br>  enum Magic<br>  {<br>    None = 0,<br><br>    Fire = 1, //огонь<br>    Air  = 2, //воздух<br>    Water = 4, //вода<br>    Earth = 8, //земля<br><br>    All  = Fire | Air | Water | Earth<br>  }<br><br>  //пример функции, работающей с перечислением<br>  static void CastSpell(float power, Magic source)<br>  {<br>    if ((source & Magic.All) == Magic.None)<br>    {<br>      Console.WriteLine("Неизвестная школа магии.");<br>      Console.WriteLine();<br>      return;<br>    }<br><br>    if ((source & Magic.Fire) != 0)<br>      Console.WriteLine("Использована магическая школа огня.");<br>    if ((source & Magic.Air) != 0)<br>      Console.WriteLine("Использована магическая школа воздуха.");<br>    if ((source & Magic.Water) != 0)<br>      Console.WriteLine("Использована магическая школа воды.");<br>    if ((source & Magic.Earth) != 0)<br>      Console.WriteLine("Использована магическая школа земли.");<br><br>    Console.WriteLine("РЕКС-ПЭКС-ФЭКС!!! (произнесено заклинание силой {0} едениц).", power);<br>    Console.WriteLine();<br>  }<br><br>  //пример использования<br>  static void Main(string[] args)<br>  {<br>    CastSpell(1, 0);<br>    CastSpell(2, Magic.None);<br>    CastSpell(3, Magic.Fire);<br>    CastSpell(4, Magic.Earth | Magic.Water);<br>    CastSpell(5, Magic.Air | Magic.Fire | Magic.Earth);<br>    CastSpell(6, Magic.All);<br>  }<br>}<br><br>* This source code was highlighted with Source Code Highlighter.
Это, конечно, не настоящее множество, со своими костылями, но пользоваться им можно. Главное не забывать про то, что элементы множества должны быть степенями двойки и помнить как работают битовые операции. Ну еще стоит почитать в MSDN про «FlagsAttribute Class».
Tags:
Hubs:
Total votes 21: ↑10 and ↓11-1
Comments17

Articles