[C#] ماذا تعني السمة [Flags] Enum Attribute في C #؟



Answers

يمكنك أيضا القيام بذلك

[Flags]
public enum MyEnum
{
    None   = 0,
    First  = 1 << 0,
    Second = 1 << 1,
    Third  = 1 << 2,
    Fourth = 1 << 3
}

أجد أن تبديل البساط أسهل من كتابة 4،8،16،32 وهكذا. ليس له أي تأثير على شفرتك لأن كل ذلك يتم في وقت التحويل البرمجي

Question

من وقت لآخر أرى تعدادًا كالتالي:

[Flags]
public enum Options 
{
    None    = 0,
    Option1 = 1,
    Option2 = 2,
    Option3 = 4,
    Option4 = 8
}

لا أفهم بالضبط ما يفعله [Flags] -attribute.

أي شخص لديه تفسير جيد أو مثال يمكنهم نشره؟




هناك شيء مفرط في التعريف بالنسبة لي في if ((x & y) == y)... ، خاصة إذا كان x و y كلاهما مجموعة مركبة من الأعلام وكنت تريد فقط معرفة ما إذا كان هناك أي تداخل.

في هذه الحالة ، كل ما تحتاج معرفته حقًا هو ما إذا كانت هناك قيمة غير صفرية [1] بعد أن يتم أخذ صورة نقطية .

[1] انظر تعليق خايمي. إذا كنا بصعوبة فعلًا من خلال عملية طرح البيانات ، فسنحتاج فقط إلى التحقق من أن النتيجة كانت إيجابية. ولكن بما أن enum يمكن أن يكون سلبياً ، حتى وإن كان غريباً ، عندما يقترن msdn ، فإنه يكون دفاعيًا لكود != 0 بدلاً من > 0 .

بناء على الإعداد @ andnil ...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BitFlagPlay
{
    class Program
    {
        [Flags]
        public enum MyColor
        {
            Yellow = 0x01,
            Green = 0x02,
            Red = 0x04,
            Blue = 0x08
        }

        static void Main(string[] args)
        {
            var myColor = MyColor.Yellow | MyColor.Blue;
            var acceptableColors = MyColor.Yellow | MyColor.Red;

            Console.WriteLine((myColor & MyColor.Blue) != 0);     // True
            Console.WriteLine((myColor & MyColor.Red) != 0);      // False                
            Console.WriteLine((myColor & acceptableColors) != 0); // True
            // ... though only Yellow is shared.

            Console.WriteLine((myColor & MyColor.Green) != 0);    // Wait a minute... ;^D

            Console.Read();
        }
    }
}



تسمح لك الإشارات باستخدام bitmasking داخل التعداد الخاص بك. هذا يسمح لك بدمج قيم التعداد ، مع الإبقاء على القيم المحددة.

[Flags]
public enum DashboardItemPresentationProperties : long
{
    None = 0,
    HideCollapse = 1,
    HideDelete = 2,
    HideEdit = 4,
    HideOpenInNewWindow = 8,
    HideResetSource = 16,
    HideMenu = 32
}



يرجى الاطلاع على ما يلي للحصول على مثال يوضح الإعلان والاستخدام المحتمل:

namespace Flags
{
    class Program
    {
        [Flags]
        public enum MyFlags : short
        {
            Foo = 0x1,
            Bar = 0x2,
            Baz = 0x4
        }

        static void Main(string[] args)
        {
            MyFlags fooBar = MyFlags.Foo | MyFlags.Bar;

            if ((fooBar & MyFlags.Foo) == MyFlags.Foo)
            {
                Console.WriteLine("Item has Foo flag set");
            }
        }
    }
}



Nidonocu

لإضافة علامة أخرى إلى مجموعة موجودة من القيم ، استخدم عامل التعيين OR.

Mode = Mode.Read;
//Add Mode.Write
Mode |= Mode.Write;
Assert.True(((Mode & Mode.Write) == Mode.Write)
  && ((Mode & Mode.Read) == Mode.Read)));



Links