[ফ্ল্যাগস] এন # অ্যাট্রিবিউট সি # এর অর্থ কী?


1445

সময়ে সময়ে আমি নীচের মতো একটি এনাম দেখতে পাই:

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

[Flags]বৈশিষ্ট্যটি ঠিক কী করে তা আমি বুঝতে পারি না ।

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


গ্রহণযোগ্য উত্তর ছাড়াও, VB.NET- এর আসলে [পতাকাগুলি] দরকার - এটি কমপক্ষে। নেট ছেলেদের অনুসারে: social.msdn.microsoft.com/forums/en-US/csharplanguage/thread/…
রাশিও

8
দ্রষ্টব্য, এই দিনগুলিতে ভিবিতে প্রয়োজন নেই। আচরণটিকে সি # হিসাবে সংরক্ষণ করুন - কেবলমাত্র টস্ট্রিং () আউটপুট পরিবর্তন করে। দ্রষ্টব্য, আপনি নিজেই এনজুমের সাথে যৌক্তিক OR করতে পারেন। খুব ঠান্ডা. বিড়াল = 1, কুকুর = 2, ক্যাটঅ্যান্ডডোগ = বিড়াল || কুকুর.
চকী

14
@ চ্যালকি আপনার মানে CatAndDog = Cat | Dog( শর্তযুক্তের পরিবর্তে লজিক্যাল ওআর), আমি ধরে নিই?
DdW

5
@ ডিডিডাব্লু, আংশিকভাবে সঠিক: | ব্যবহার করা উচিত, কিন্তু | বাইনারি OR বলা হয় is দ্বিতীয় যৌক্তিক অথবা (যে স্বল্প-পরিক্রমার মঞ্জুর করে): অন্তত মাইক্রোসফট অনুযায়ী;) msdn.microsoft.com/en-us/library/f355wky8.aspx
Pieter21

উত্তর:


2152

[Flags]যখনই গণনীয় বরং একটি একক মান চেয়ে সম্ভাব্য মান একটি সংগ্রহ প্রতিনিধিত্ব করে অ্যাট্রিবিউট ব্যবহার করা উচিত। এই জাতীয় সংগ্রহগুলি প্রায়শই বিটওয়াইড অপারেটরগুলির সাথে ব্যবহৃত হয়, উদাহরণস্বরূপ:

var allowedColors = MyColor.Red | MyColor.Green | MyColor.Blue;

নোট করুন যে [Flags]গুণটি এটিকে নিজেই সক্ষম করে না - এটির দ্বারা সমস্ত কিছুই .ToString()পদ্ধতি দ্বারা একটি সুন্দর উপস্থাপনা মঞ্জুরি দেয় :

enum Suits { Spades = 1, Clubs = 2, Diamonds = 4, Hearts = 8 }
[Flags] enum SuitsFlags { Spades = 1, Clubs = 2, Diamonds = 4, Hearts = 8 }

...

var str1 = (Suits.Spades | Suits.Diamonds).ToString();
           // "5"
var str2 = (SuitsFlags.Spades | SuitsFlags.Diamonds).ToString();
           // "Spades, Diamonds"

এটি লক্ষ করাও গুরুত্বপূর্ণ যে এটি এনামকে দু'টির মানকে স্বয়ংক্রিয়ভাবে তৈরি [Flags] করে না । আপনি যদি সংখ্যাসূচক মানগুলি বাদ দেন তবে এনাম বিটওয়াইজ অপারেশনে যেমন প্রত্যাশা করতে পারে তেমনভাবে কাজ করবে না, কারণ ডিফল্টরূপে মান 0 এবং বৃদ্ধি দিয়ে শুরু হয়।

ভুল ঘোষণা:

[Flags]
public enum MyColors
{
    Yellow,  // 0
    Green,   // 1
    Red,     // 2
    Blue     // 3
}

মানগুলি যদি এইভাবে ঘোষিত হয় তবে এটি হলুদ = 0, সবুজ = 1, লাল = 2, নীল = 3 হবে This এটি পতাকা হিসাবে অকেজো হয়ে যাবে।

এখানে সঠিক ঘোষণার উদাহরণ রয়েছে:

[Flags]
public enum MyColors
{
    Yellow = 1,
    Green = 2,
    Red = 4,
    Blue = 8
}

আপনার সম্পত্তির স্বতন্ত্র মানগুলি পুনরুদ্ধার করতে, কেউ এটি করতে পারেন:

if (myProperties.AllowedColors.HasFlag(MyColor.Yellow))
{
    // Yellow is allowed...
}

অথবা নেট 4 এর পূর্বে:

if((myProperties.AllowedColors & MyColor.Yellow) == MyColor.Yellow)
{
    // Yellow is allowed...
}

if((myProperties.AllowedColors & MyColor.Green) == MyColor.Green)
{
    // Green is allowed...
}    

আবরণের নিচে

এটি কাজ করে কারণ আপনি নিজের গণনায় দু'জনের শক্তি ব্যবহার করেছেন। কভারগুলির নীচে, আপনার অঙ্কের মানগুলি বাইনারি এবং শূন্যগুলিতে এর মতো দেখায়:

 Yellow: 00000001
 Green:  00000010
 Red:    00000100
 Blue:   00001000

একইভাবে, আপনি বাইনারি বিটওয়াইস বা অপারেটরটি ব্যবহার করে আপনার সম্পত্তিটিকে মঞ্জুরিপ্রাপ্ত লাল, সবুজ এবং নীল রঙে সেট করার পরে অনুমোদিত মঞ্জুরিদাতাকে এরকম দেখাচ্ছে:|

myProperties.AllowedColors: 00001110

সুতরাং আপনি যখন মানটি পুনরুদ্ধার করবেন তখন আপনি প্রকৃতপক্ষে বিটওয়াইড এবং &মানগুলিতে সম্পাদন করছেন :

myProperties.AllowedColors: 00001110
             MyColor.Green: 00000010
             -----------------------
                            00000010 // Hey, this is the same as MyColor.Green!

কোনটি নয় = 0 মান

এবং 0এমএসডিএন থেকে উদ্ধৃত করে আপনার গণনার ব্যবহার সম্পর্কিত :

[Flags]
public enum MyColors
{
    None = 0,
    ....
}

প্রত্যাশিত গণনা করা ধ্রুবকের নাম হিসাবে কিছুই ব্যবহার করুন যার মান শূন্য। আপনি পতাকাটির পরীক্ষার জন্য কিছুটা গণনা করা ধ্রুবককে বিটওয়াস এবং অপারেশনে ব্যবহার করতে পারবেন না কারণ ফলাফল সর্বদা শূন্য থাকে। তবে, আপনি সংখ্যাসূচক মান এবং কোনও বিট সেট আছে কিনা তা নির্ধারণের জন্য সংখ্যাসূচক মান এবং কোনওটি গণনা করা ধ্রুবকের মধ্যে তুলনা করে কিছুটা লজিক্যাল সম্পাদন করতে পারেন।

আপনি আরও পতাকা অ্যাট্রিবিউট সম্পর্কে এবং তথ্য তার ব্যবহার জানতে পারেন MSDN এবং MSDN এ পতাকা নকশা


156
পতাকাগুলি নিজেই কিছুই করে না। এছাড়াও, সি # এর জন্য প্রতি সেফ ফ্ল্যাগের প্রয়োজন নেই। কিন্তু ToStringআপনার enum বাস্তবায়ন পতাকা ব্যবহার, এবং তাই করে Enum.IsDefined, Enum.Parseইত্যাদি MyColor.Yellow ফল এ পতাকা এবং বর্ণন অপসারণ করার চেষ্টা করুন | MyColor.Red; এটি ছাড়াই আপনি "5" পাবেন, পতাকা সহ আপনি "হলুদ, লাল" পান। কাঠামোর অন্যান্য কিছু অংশ [ফ্ল্যাগস] (যেমন, এক্সএমএল সিরিয়ালাইজেশন) ব্যবহার করে।
রুবেন

7
// হলুদ সেট করা হয়েছে ..., আমি কিছুটা বিভ্রান্তিকর দেখতে পেলাম। কিছুই সেট করা হয়নি, এর অর্থ হল যে হলুদ আপনার অনুমোদিত মাতৃভাষার সদস্য, সম্ভবত আরও ভাল হবে // হলুদ অনুমোদিত?
স্কট ওয়েভার

48
আমি A = 1 << 0, বি = 1 << 1, সি = 1 << 2 ... ফর্মটির ধ্রুবকগুলি ব্যবহার করতে পছন্দ করি ... পড়তে, বুঝতে, চাক্ষুষভাবে পরীক্ষা করা ও পরিবর্তন করা অনেক সহজ।
নিক ওয়েস্টগেট

2
@ বার্ডেন, হ্যাঁ! আমি এটি খুঁজে পেয়েছি: এমএসডিএন.মাইক্রোসফট.ইন- ইউএস / লাইব্রেরি / সিস্টেমে.এনম.এএসপিএক্স - "মন্তব্যগুলি" অংশটি দেখুন: "এনট ফ্রেমওয়ার্কের সমস্ত গণনার জন্য এনাম বেস শ্রেণি class" এবং "গণনাটি এনামের কাছ থেকে স্পষ্টভাবে উত্তরাধিকার সূত্রে প্রাপ্ত হয় না; উত্তরাধিকার সম্পর্ক সংকলক দ্বারা সুস্পষ্টভাবে পরিচালিত হয়" " সুতরাং, যখন আপনি লিখবেন: পাবলিক এনাম ব্লে ব্লে ব্লে - এটি একটি মান ধরণের। তবে, হাসফ্লেগ পদ্ধতিটি আপনাকে তাকে সিস্টেমের একটি উদাহরণ দেওয়ার জন্য চায় nএনুম যা একটি শ্রেণি (রেফারেন্স টাইপ :)
আলেকসি শেপভোই

2
যদি আপনি গণনা থেকে কোনও পতাকা বাদ দিতে চান তবে xor ব্যবহার করুন, যা # সি # তে রয়েছে। সুতরাং আপনি যদি myProperties.AllowedColors = MyColor.Red | MyColor.Green | MyColor.Blue;। আপনি করতে পারেন:myProperties.AllowedColors = myProperties.AllowedColors ^ MyColor.Blue //myProperties.AllowedColors == MyColor.Red | Mycolor.Green
জোশ নোই

778

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

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

আমি 4,8,16,32 এবং এ জাতীয় টাইপ করার চেয়ে বিট-শিফটিংকে আরও সহজ মনে করি। আপনার কোডে এর কোনও প্রভাব নেই কারণ এটি সমস্তই সংকলনের সময়ে সম্পন্ন হয়েছে


18
এটাই আমার অর্থ, আমি সোর্স কোডের সম্পূর্ণ ইনটাকে পছন্দ করি। আমার যদি ডেটাবেজে মাইইনাম নামে একটি টেবিলে একটি কলাম থাকে যা এনামগুলির মধ্যে একটির মান রাখে এবং একটি রেকর্ডে 131,072 থাকে তবে আমার মানক 1 এর সাথে এনামের সাথে মিল রয়েছে তা নির্ধারণ করার জন্য আমার ক্যালকুলেটরটি বের করতে হবে would << 17। উত্সটিতে লিখিত 131,072 মানটি দেখার বিপরীতে।
জেরেমিওয়ের

6
@jwg আমি সম্মতি জানাই, এটির রানটাইম পারফরম্যান্স সম্পর্কে অতিরিক্ত চিন্তিত হওয়া নির্বোধ, তবে সব মিলিয়ে, আমি এটি জেনে ভাল লাগছি যে আপনি কোথাও এনাম ব্যবহার করবেন না কেন এটি বিটশিফ্টগুলি সন্নিবেশ করবে না। পারফরম্যান্স সম্পর্কিত কোনও কিছুর চেয়ে '' ঝরঝরে 'জিনিস'
অরিওন এডওয়ার্ডস

18
@ জেরেমিওয়েয়ার - একটি পতাকা গণনা মানতে বেশ কয়েকটি বিট সেট হতে চলেছে। সুতরাং আপনার ডেটা বিশ্লেষণের পদ্ধতিটি যা অনুচিত। বাইনারিতে আপনার পূর্ণসংখ্যার মান উপস্থাপনের জন্য একটি পদ্ধতি চালান। 131,072 [ডি] = 0000 0000 0000 0001 0000 0000 0000 0000 [বি] [32] .. 17 তম বিট সেট সহ, 1 << 17 নির্ধারিত একটি এনাম মান সহজেই নির্ধারণযোগ্য। 0110 0011 0011 0101 0101 0011 0101 1011 [খ] [32] .. এনাম মান 1 << 31, 1 << 30, 1 << 26, 1 << 25 .. ইত্যাদি নির্ধারণ করে এমনকি এটি ছাড়াই নির্ধারণযোগ্য একেবারে ক্যালকুলেটরের সহায়তা .. যা আমি সন্দেহ করি আপনি বাইনারি রেপ না পেয়ে আপনি নির্ধারণ করতে সক্ষম হবেন।
ব্রেট ক্যাসওয়েল

13
এছাড়াও উল্লেখ করে আপনি সংখ্যার চেয়ে সরাসরি "পূর্ববর্তী" এনাম মানগুলি থেকে বিট-শিফট করতে পারেন, এর Third = Second << 1চেয়ে Third = 1 << 2- নীচে আরও সম্পূর্ণ বিবরণ দেখুন
ড্রাজাস

26
আমি ভালো, কিন্তু একবার আপনাকে অন্তর্নিহিত enum টাইপ উপরের সীমা পেতে, কম্পাইলার যেমন বিট বদল আনতে বিরুদ্ধে সতর্ক না 1 << 31 == -2147483648, 1 << 32 == 1, 1 << 33 == 2, ইত্যাদি। বিপরীতে, আপনি যদি ThirtySecond = 2147483648কোনও int টাইপ এনুমের জন্য বলেন , সংকলকটি একটি ত্রুটি ছুড়ে ফেলে।
অ্যানটোয়াইন

115

উত্তর মিশ্রন https://stackoverflow.com/a/8462/1037948 (ঘোষণা বিট-নাড়াচাড়া মাধ্যমে) এবং https://stackoverflow.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

23
সংমিশ্রণগুলি একটি ভাল সুপারিশ, তবে আমি মনে করি যে শৃঙ্খলযুক্ত বিট-শিফটটি টু = ওয়ান << 1, থ্রি = ওয়ান << 1 ইত্যাদি ইত্যাদির মতো অনুলিপি-এবং-পেস্ট ত্রুটিযুক্ত হতে পারে ... এর বর্ধক পূর্ণসংখ্যার ফর্ম 1 << n নিরাপদ এবং উদ্দেশ্যটি আরও পরিষ্কার।
রূপের রাভসলে

2
@ রবার্ট রওনসলে আমার উত্তরটি উদ্ধৃত করার জন্য:> অগত্যা এটির সুপারিশ করা নয়, তবে কেবল আপনিই পারেন এটি নির্দেশ করে
ড্রাজাস

49

ঘোষণা এবং সম্ভাব্য ব্যবহার দেখায় এমন উদাহরণের জন্য দয়া করে নিম্নলিখিতটি দেখুন:

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

আপনি যদি [পতাকাগুলি ছেড়ে যান) এই উদাহরণটি কার্যকর হয়। এটি [পতাকা] অংশটি সম্পর্কে আমি জানার চেষ্টা করছি।
gabry

39

গৃহীত উত্তরের উত্তরণে, সি # 7 এ বাইনারি আক্ষরিক ব্যবহার করে এনাম পতাকাগুলি লেখা যেতে পারে:

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

আমি মনে করি যে এই উপস্থাপনাটি পরিষ্কার করে দেয় যে কীভাবে পতাকাগুলি কভারের নীচে কাজ করে


2
এবং সি # 7.2 এ এটি শীর্ষস্থানীয় বিভাজকের সাথে আরও পরিষ্কার ! 0b_0100
ভিনসেঞ্জো পেট্রনো

37

আমি অনুরূপ কিছু সম্পর্কে সম্প্রতি জিজ্ঞাসা করেছি ।

আপনি যদি পতাকা ব্যবহার করেন তবে অন্তর্ভুক্ত ফ্ল্যাগগুলি চেক করা সহজ করার জন্য আপনি এনামগুলিতে একটি এক্সটেনশন পদ্ধতি যুক্ত করতে পারেন (বিস্তারিত পোস্ট দেখুন)

এটি আপনাকে করতে দেয়:

[Flags]
public enum PossibleOptions : byte
{
    None = 0,
    OptionOne = 1,
    OptionTwo = 2,
    OptionThree = 4,
    OptionFour = 8,

    //combinations can be in the enum too
    OptionOneAndTwo = OptionOne | OptionTwo,
    OptionOneTwoAndThree = OptionOne | OptionTwo | OptionThree,
    ...
}

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

PossibleOptions opt = PossibleOptions.OptionOneTwoAndThree 

if( opt.IsSet( PossibleOptions.OptionOne ) ) {
    //optionOne is one of those set
}

আমি অন্তর্ভুক্ত পতাকা চেক করার সর্বাধিক উপায়ের চেয়ে পড়তে সহজ মনে করি।


ইসসেট একটি এক্সটেনশন পদ্ধতি আমি ধরে নিই?
রবার্ট ম্যাকলিন

হ্যাঁ - বিশদটির
কিথ

71
.NET 4 গণনায় একটি HasFlagপদ্ধতি যুক্ত করে, যাতে আপনি opt.HasFlag( PossibleOptions.OptionOne )নিজের এক্সটেনশান না লিখেই করতে পারেন
অরিয়ন এডওয়ার্ডস

1
লক্ষ্য করুন HasFlagহয় অনেক ধীর , bitwise অপারেশন করছেন চেয়ে।
ওয়াই হা লি

1
@ ওয়াইএইলি আপনি কোডজাম.ইনুমহেল্পার.আইএসফ্ল্যাগসেট এক্সটেনশন পদ্ধতিটি ব্যবহার করতে পারেন যা এক্সপ্রেশন ব্যবহার করে দ্রুত সংস্করণে সংকলিত হয়েছে: github.com/rsdn/CodeJam/wiki/M_CodeJam_EnumHelper_IsFlagSet__1
NN_

22

@Nidonocu

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

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

18

পতাকা নিয়ে কাজ করার সময় আমি প্রায়শই অতিরিক্ত না কোনও এবং সমস্ত আইটেম ঘোষণা করি। এগুলি সমস্ত পতাকা সেট করা আছে বা কোনও পতাকা সেট করা হয়নি তা যাচাই করতে সহায়ক।

[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

 
2019-10 আপডেট করুন:

যেহেতু সি # 7.0 আপনি বাইনারি আক্ষরিক ব্যবহার করতে পারেন যা সম্ভবত পড়ার জন্য আরও স্বজ্ঞাত:

[Flags] 
enum SuitsFlags { 

    None =     0b0000,

    Spades =   0b0001, 
    Clubs =    0b0010, 
    Diamonds = 0b0100, 
    Hearts =   0b1000,

    All =      0b1111

}


14

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

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

[1] জাইমের মন্তব্য দেখুন। যদি আমরা প্রমাণীকরণে বিটমাস্কিং করতাম, তবে কেবল আমাদের ফলাফলটি ইতিবাচক ছিল কিনা তা খতিয়ে দেখা দরকার। কিন্তু যেহেতু enumগুলি নেতিবাচক হতে পারে, এমনকি, অদ্ভুত, যখন সঙ্গে মিলিত অ্যাট্রিবিউট , এটা কোডে আত্মরক্ষামূলক জন্য বদলে ।[Flags]!= 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();
        }
    }
}

এনাম একটি স্বাক্ষরিত ধরণের ভিত্তিতে তৈরি হতে পারে, সুতরাং আপনার "> 0" এর পরিবর্তে "! = 0" ব্যবহার করা উচিত।
কাক

@ জাইমপার্ডোস - যতক্ষণ না আমরা এগুলিকে সৎ বাইট রাখি, যতক্ষণ না আমি এই উদাহরণটিতে করি, নেতিবাচক কোনও ধারণা নেই। মাত্র 0 থেকে 255 পর্যন্ত। এমএসডিএন সতর্ক করে দিয়েছে , "আপনি যদি একটি নেগেটিভ সংখ্যাটিকে পতাকা হিসাবে গণ্য করা ধ্রুবক হিসাবে সংজ্ঞায়িত করেন তবে সাবধানতা অবলম্বন করুন কারণ ... [যা] আপনার কোডটিকে বিভ্রান্ত করতে এবং কোডিং ত্রুটিগুলিকে উত্সাহিত করতে পারে।" "নেতিবাচক বিটফ্লাগস" এর বিবেচনায় ভাবতে অবাক লাগে! ;।) আমি আরও কিছুটা সম্পাদনা করব। তবে আপনি ঠিক বলেছেন, আমরা যদি আমাদের মধ্যে নেতিবাচক মান ব্যবহার করি তবে আমাদের enumযাচাই করা দরকার != 0
রাফিন

10

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

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

0

ইতিমধ্যে কেউ যদি এই দৃশ্যটি লক্ষ্য করে থাকে। পতাকাগুলির একটি নিখুঁত উদাহরণ আমরা প্রতিচ্ছবি দেখতে পাচ্ছি। হ্যাঁ বাইন্ডিং ফ্ল্যাগগুলি ENUM। https://docs.microsoft.com/en-us/dotnet/api/system.reflection.bindingflags?view=netframework-4.8

[System.Flags]
[System.Runtime.InteropServices.ComVisible(true)]
[System.Serializable]
public enum BindingFlags

ব্যবহার

             // BindingFlags.InvokeMethod
            // Call a static method.
            Type t = typeof (TestClass);

            Console.WriteLine();
            Console.WriteLine("Invoking a static method.");
            Console.WriteLine("-------------------------");
            t.InvokeMember ("SayHello", BindingFlags.InvokeMethod | BindingFlags.Public | 
                BindingFlags.Static, null, null, new object [] {});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.