[ফ্ল্যাগ] Enum বৈশিষ্ট্য C#মানে কি?




enums flags (8)

সময়ে সময়ে আমি নিম্নলিখিত মত একটি enum দেখতে:

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

আমি বুঝতে পারছি না ঠিক কি [Flags] -প্রদান করে।

যে কেউ একটি ভাল ব্যাখ্যা বা উদাহরণ তারা পোস্ট করতে পারে?


@Nidonocu

মানগুলির একটি বিদ্যমান সেটে অন্য পতাকা যুক্ত করতে, OR অ্যাসাইনমেন্ট অপারেটরটি ব্যবহার করুন।

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

আপনি এটা করতে পারেন

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

আমি 4,8,16,32 টাইপ চেয়ে বিট-বদলানো সহজ খুঁজে এবং তাই। এটা আপনার কোড উপর কোন প্রভাব আছে কারণ এটি সব কম্পাইল সময় সম্পন্ন


উত্তরগুলি একত্রিত করে https://.com/a/8462/1037948 (বিট-বদলির মাধ্যমে ঘোষণা) এবং https://.com/a/9117/1037948 (ঘোষণায় সমন্বয়গুলি ব্যবহার করে) আপনি পূর্বের মানগুলি বিট-বদল করতে পারেন সংখ্যা ব্যবহার করার চেয়ে। অগত্যা এটা সুপারিশ না, কিন্তু শুধু আপনি নির্দেশ করতে পারেন।

বরং:

[Flags]
public enum Options : byte
{
    None    = 0,
    One     = 1 << 0,   // 1
    Two     = 1 << 1,   // 2
    Three   = 1 << 2,   // 4
    Four    = 1 << 3,   // 8

    // combinations
    OneAndTwo = One | Two,
    OneTwoAndThree = One | Two | Three,
}

আপনি ঘোষণা করতে পারেন

[Flags]
public enum Options : byte
{
    None    = 0,
    One     = 1 << 0,       // 1
    // now that value 1 is available, start shifting from there
    Two     = One << 1,     // 2
    Three   = Two << 1,     // 4
    Four    = Three << 1,   // 8

    // same combinations
    OneAndTwo = One | Two,
    OneTwoAndThree = One | Two | Three,
}

লিংকপ্যাডের সাথে নিশ্চিতকরণ:

foreach(var e in Enum.GetValues(typeof(Options))) {
    string.Format("{0} = {1}", e.ToString(), (byte)e).Dump();
}

ফলাফল স্বরূপ:

None = 0
One = 1
Two = 2
OneAndTwo = 3
Three = 4
OneTwoAndThree = 7
Four = 8

গ্রহণযোগ্য উত্তরের সম্প্রসারণে, C # 7 এ enum পতাকাগুলি বাইনারি লিখন ব্যবহার করে লেখা যেতে পারে:

[Flags]
public enum MyColors
{
    None   = 0b0000,
    Yellow = 0b0001,
    Green  = 0b0010,
    Red    = 0b0100,
    Blue   = 0b1000
}

আমি মনে করি এই উপস্থাপনাটি কিভাবে ফ্ল্যাগগুলি কভারের অধীনে কাজ করে তা স্পষ্ট করে তোলে।


পতাকা আপনার গণনার ভিতরে বিটমাস্কিং ব্যবহার করার অনুমতি দেয়। এটি আপনাকে নির্দিষ্টকরণের মানগুলি একত্রিত করার অনুমতি দেয়, যখন কোনটি নির্দিষ্ট করা হয় তা ধরে রাখতে।

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

পতাকা সঙ্গে কাজ করার সময় আমি প্রায়ই অতিরিক্ত কেউ এবং সব আইটেম ঘোষণা। এই সমস্ত পতাকা সেট করা হয়েছে কিনা বা কোন পতাকা সেট করা হয় কিনা তা পরীক্ষা করার জন্য সহায়ক।

[Flags] 
enum SuitsFlags { 

    None =     0,

    Spades =   1 << 0, 
    Clubs =    1 << 1, 
    Diamonds = 1 << 2, 
    Hearts =   1 << 3,

    All =      ~(~0 << 4)

}

ব্যবহার:

Spades | Clubs | Diamonds | Hearts == All  // true
Spades & Clubs == None  // true

Mode.Write যোগ করার জন্য:

Mode = Mode | Mode.Write;

if ((x & y) == y)... সম্পর্কে কিছু অতিরিক্ত ক্রিয়াপদ if ((x & y) == y)... গঠন করুন, বিশেষ করে যদি x এবং y উভয় যৌগিক পতাকা সেট থাকে এবং আপনি কেবলমাত্র জানতে চান যে কোনো ওভারল্যাপ আছে কিনা।

এই ক্ষেত্রে, আপনি যদি সত্যিই বিটমাস্কড করার পরে একটি অ-শূন্য মান [1] থাকে তবে আপনাকে এটি জানাতে হবে

[1] জাইমের মন্তব্য দেখুন। আমরা যদি সত্যিকার অর্থে বিটমাস্কিং করতাম , তাহলে কেবল ফলাফলটি ইতিবাচক ছিল কিনা তা যাচাই করতে হবে। কিন্তু যেহেতু enum গুলি নেতিবাচক, এমনকি, অদ্ভুতভাবে, msdn সাথে মিলিত হওয়ার msdn , != 0 পরিবর্তে != 0 জন্য কোডের পক্ষে রক্ষাকারী।

@ আনিল এর সেটআপ বন্ধ করা হচ্ছে ...

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();
        }
    }
}




flags