C # හි [ධජ] එනූම් ගුණාංගය අදහස් කරන්නේ කුමක්ද?


1465

වරින් වර මම පහත දැක්වෙන ආකාරයේ එනැමයක් දකිමි:

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

[Flags]ගුණාංගය හරියටම කරන්නේ කුමක්දැයි මට තේරෙන්නේ නැත .

ඕනෑම කෙනෙකුට පළ කළ හැකි හොඳ පැහැදිලි කිරීමක් හෝ උදාහරණයක් තිබේද?


පිළිගත් පිළිතුරට අමතරව, VB.NET සඳහා ඇත්ත වශයෙන්ම [කොඩි] අවශ්‍ය බව ද සඳහන් කිරීම වටී - අවම වශයෙන් .NET යාලුවනේ අනුව: social.msdn.microsoft.com/forums/en-US/csharplanguage/thread/…
රුෂියෝ

8
සටහන, මේ දිනවල VB හි අවශ්‍ය නොවේ. හැසිරීම C # ලෙස සුරකින්න - ToString () ප්‍රතිදානය වෙනස් කරයි. සටහන, ඔබට තාර්කික හෝ එනුම් සමඟ කළ හැකිය. ඉතා සිසිල්. Cat = 1, බල්ලා = 2, CatAndDog = Cat || බල්ලා.
හුණු

14
Al චාල්කි ඔබ අදහස් කළේ CatAndDog = Cat | Dog(කොන්දේසි වෙනුවට තාර්කික හෝ), මම හිතන්නේ?
DdW

5
DDdW, අර්ධ වශයෙන් නිවැරදි: | භාවිතා කළ යුතුය, නමුත් | ද්විමය OR ලෙස හැඳින්වේ. II යනු තාර්කික OR (කෙටි පරිපථයට ඉඩ සලසයි): අවම වශයෙන් මයික්‍රොසොෆ්ට් අනුව;) msdn.microsoft.com/en-us/library/f355wky8.aspx
පීටර්

Answers:


2172

ගණන් [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. මෙය කොඩි ලෙස නිෂ් less ල වනු ඇත.

නිවැරදි ප්‍රකාශයක උදාහරණයක් මෙන්න:

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

ඔබේ දේපලෙහි ඇති සුවිශේෂී අගයන් ලබා ගැනීමට කෙනෙකුට මෙය කළ හැකිය:

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

හෝ .NET 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,
    ....
}

ධජය ගණනය කළ නියතයේ අගය ලෙස ශුන්‍ය වන කිසිවක් භාවිතා නොකරන්න. ධජය සඳහා පරීක්ෂා කිරීම සඳහා ඔබට කිසිවක් ගණනය කළ නියතය බිට්වේස් සහ මෙහෙයුමක භාවිතා කළ නොහැක, මන්ද ප්‍රති result ලය සැමවිටම ශුන්‍ය වේ. කෙසේ වෙතත්, සංඛ්‍යාත්මක අගයේ කිසියම් බිටු සකසා තිබේද යන්න තීරණය කිරීම සඳහා සංඛ්‍යාත්මක අගය සහ කිසිවක් ගණනය කළ නියතය අතර සැසඳීමක් ඔබට තර්කානුකූලව කළ හැකිය.

කොඩි ගුණාංගය සහ එහි භාවිතය පිළිබඳ වැඩි විස්තර msdn හි සහ msdn හි කොඩි සැලසුම් කිරීම පිළිබඳ වැඩි විස්තර ඔබට සොයාගත හැකිය


156
කොඩි කිසිවක් නොකරයි. එසේම, C # ට කොඩි අවශ්‍ය නොවේ. නමුත් ToStringඔබේ නිඛිල භාවිතා කොඩි ක්රියාත්මක කිරීම, සහ එසේ Enum.IsDefined, Enum.Parseආදිය MyColor.Yellow ප්රතිඵලයක් දී කොඩි හා පෙනුම ඉවත් කිරීමට උත්සාහ කරන්න | MyColor.Red; එය නොමැතිව ඔබට "5" ලැබෙනු ඇත, කොඩි සමඟ ඔබට "කහ, රතු" ලැබේ. රාමුවේ තවත් සමහර කොටස් [කොඩි] භාවිතා කරයි (උදා: XML අනුක්‍රමිකකරණය).
රූබන්

7
// කහ පැහැය සකසා ඇත ..., මම ටිකක් නොමඟ යවන බවක් පෙනේ. කිසිවක් සකසා නැත, එයින් අදහස් කරන්නේ කහ යනු ඔබේ අවසර ලත් වර්ණවල සාමාජිකයෙකු බවයි, සමහර විට වඩා හොඳ වනු ඇත // කහ සඳහා අවසර තිබේද?
ස්කොට් වීවර්

50
A = 1 << 0, B = 1 << 1, C = 1 << 2 ... හි නියතයන් භාවිතා කිරීමට මම කැමැත්තෙමි ... කියවීමට, තේරුම් ගැනීමට, දෘශ්‍ය පරීක්‍ෂා කිරීමට සහ වෙනස් කිරීමට වඩා පහසුය.
නික් වෙස්ට්ගේට්

2
@ බෝර්ඩන්, අපාය ඔව්! මට මෙය හමු විය: msdn.microsoft.com/en-us/library/system.enum.aspx - “සටහන්” කොටස බලන්න: “.NET රාමුවේ සියලුම ගණනය කිරීම් සඳහා මූලික පන්තිය එනුම් වේ.” සහ "ගණන් බැලීම පැහැදිලිවම එනුම් වෙතින් උරුම නොවේ; උරුම සම්බන්ධතාවය සම්පාදකයා විසින් ව්‍යංගයෙන් හසුරුවනු ලැබේ." එබැවින්, ඔබ ලියන විට: public enum bla bla bla - මෙය අගය වර්ගයකි. නමුත්, HasFlag ක්‍රමයට අවශ්‍ය වන්නේ ඔබ ඔහුට System.Enum පිළිබඳ උදාහරණයක් ලබා දීමයි. එය පන්තියක් (යොමු වර්ගය :)
Aleksei Chepovoi

2
ගණනය කිරීමෙන් ධජයක් බැහැර කිරීමට ඔබට අවශ්‍ය නම්, or C # හි ඇති xor භාවිතා කරන්න. ඉතින් ඔබට තිබේ නම් myProperties.AllowedColors = MyColor.Red | MyColor.Green | MyColor.Blue;. ඔබට කළ හැකිය:myProperties.AllowedColors = myProperties.AllowedColors ^ MyColor.Blue //myProperties.AllowedColors == MyColor.Red | Mycolor.Green
ජොෂ් නො

785

ඔබට මෙයද කළ හැකිය

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

4,8,16,32 ටයිප් කිරීමට වඩා බිට් මාරුව පහසු බව මට පෙනේ. එය ඔබගේ කේතයට කිසිදු බලපෑමක් ඇති නොකරයි


18
මා අදහස් කළේ එයයි, ප්‍රභව කේතයේ සම්පූර්ණ int ලබා ගැනීමට මම කැමැත්තෙමි. දත්ත සමුදායේ ඇති එක් වගුවක අගය ගබඩා කරන මයිනම් නම් දත්ත ගබඩාවේ තීරුවක් මා සතුව තිබේ නම්, සහ වාර්තාවක 131,072 ක් තිබේ නම්, එය 1 වන අගය සමඟ එනමයට අනුරූප වන බව වටහා ගැනීමට මගේ කැල්කියුලේටරය ලබා ගත යුතුය. << 17. මූලාශ්‍රයේ ලියා ඇති 131,072 වටිනාකම දැකීමට වඩා වෙනස්ව.
ජෙරමිවෙයාර්

6
wjwg මම එකඟ වෙමි, මෙහි ධාවන කාල ක්‍රියාකාරිත්වය ගැන ඕනෑවට වඩා කනස්සල්ලට පත්වීම මෝඩකමකි, නමුත් ඒ සියල්ලම, මම සිතන්නේ ඔබ එනුම් භාවිතා කරන ඕනෑම තැනක බිට්ෂිෆ්ට් ඇතුළත් නොකරන බව දැන ගැනීම සතුටක්. කාර්ය සාධනය හා සම්බන්ධ ඕනෑම දෙයකට වඩා 'එය පිළිවෙළකට' ඇති දෙයක්
ඔරියන් එඩ්වර්ඩ්ස්

19
@ ජෙරමි වීර් - ධජ ගණන් කිරීමේ අගයක බිටු කිහිපයක් සැකසීමට නියමිතය. එබැවින් ඔබේ දත්ත විශ්ලේෂණ ක්‍රමය නුසුදුසු දෙයයි. ඔබේ නිඛිල අගය ද්විමය වශයෙන් නිරූපණය කිරීමට ක්‍රියා පටිපාටියක් ක්‍රියාත්මක කරන්න. 131,072 [D] = 0000 0000 0000 0001 0000 0000 0000 [B] [32] .. 17 වන බිට් කට්ටලය සමඟ 1 << 17 පවරා ඇති enum අගය පහසුවෙන් තීරණය කළ හැකිය. 0110 0011 0011 0101 0101 0011 0101 1011 [ආ] [32] .. එනුම් අගයන් 1 << 31, 1 << 30, 1 << 26, 1 << 25 .. යනාදිය පවරනු ලැබේ. කැල්කියුලේටරයක ආධාරය .. ද්විමය නියෝජිතයා ලබා නොගෙන ඔබට කිසිසේත් තීරණය කළ හැකි යැයි මම සැක කරමි.
බ්‍රෙට් කැස්වෙල්

13
එසේම ඔබ පෙන්වා දෙමින් ඒ වෙනුවට අංක කෙලින්ම වඩා "කලින් පැවති" නිඛිල සාරධර්ම, එනම් සිට ටිකක්-මාරුව හැකි Third = Second << 1වඩා Third = 1 << 2- බලන්න පහත වඩාත් සම්පූර්ණ විස්තරයක්
drzaus

28
මම මේ වගේ, නමුත් ඔබට සම්පාදකවරයා වැනි ටිකක් මුර හැරීමට එරෙහිව නොවේ යටින් පවතින නිඛිල වර්ගය ඉහළ සීමාවන් වෙත ලබා වරක් 1 << 31 == -2147483648, 1 << 32 == 1, 1 << 33 == 2, සහ යනාදි. ඊට වෙනස්ව, ඔබ ThirtySecond = 2147483648int වර්ගයේ enum සඳහා පැවසුවහොත් , සම්පාදකයා දෝෂයක් විසි කරයි.
aaaantoine

116

පිළිතුරු ඒකාබද්ධ කිරීම 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();
}

ප්‍රති Results ල:

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

24
සංයෝජන හොඳ නිර්දේශයකි, නමුත් දම්වැල් සහිත බිටු මාරුව ද්වි = එක << 1, තුන = එක << 1, වැනි පිටපත්-හා-පේස්ට් දෝෂ වලට ගොදුරු වනු ඇතැයි මම සිතමි ... වැඩිවන පූර්ණ සංඛ්‍යා ආකෘති පත්‍රය << n ආරක්ෂිත වන අතර අභිප්‍රාය පැහැදිලි වේ.
රූපට් රෝන්ස්ලි

2
Answer රුපර්ට් රෝන්ස්ලි මගේ පිළිතුර උපුටා දැක්වීමට:> එය අනිවාර්යයෙන්ම නිර්දේශ කිරීම නොව, ඔබට හැකි බව පෙන්වා දීම
drzaus

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

ඔබ [කොඩි] අතහැර දැමුවද මෙම උදාහරණය ක්‍රියාත්මක වේ. මම ඉගෙන ගැනීමට උත්සාහ කරන [කොඩි] කොටස එයයි.
gbarry

41

පිළිගත් පිළිතුරට දීර් extension වශයෙන්, සී # 7 හි එනුම් ධජ ද්විමය වචනාර්ථයෙන් ලිවිය හැකිය:

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

ආවරණ යටතේ කොඩි ක්‍රියා කරන ආකාරය මෙම නිරූපණයෙන් පැහැදිලි වන බව මම සිතමි .


4
C # 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
}

ඇතුළත් කළ කොඩි පරීක්ෂා කිරීමේ බොහෝ ක්‍රමවලට වඩා මෙය කියවීමට පහසු බව මට පෙනේ.


IsSet යනු මා උපකල්පනය කරන ව්‍යාප්ති ක්‍රමයක් ද?
රොබට් මැක්ලීන්

ඔව් - විස්තර සඳහා මා සම්බන්ධ කරන අනෙක් ප්‍රශ්නය කියවන්න: stackoverflow.com/questions/7244
Keith

71
.NET 4 HasFlagගණනය කිරීම් සඳහා ක්‍රමවේදයක් එක් කරයි , එබැවින් ඔබට opt.HasFlag( PossibleOptions.OptionOne )ඔබේම දිගු
ලිවීමකින්

1
බව සටහන HasFlagවේ වේගය බෙහෙවින් අඩු bitwise මෙහෙයුම් කරන්නේ වඩා.
වයි හ ලී

1
: ඔබ අදහස් ප්රකාශ භාවිතා කර වේගයෙන් අනුවාදය සම්පාදනය කළ CodeJam.EnumHelper.IsFlagSet දීර්ඝ ක්රමය භාවිතා කල හැක @WaiHaLee github.com/rsdn/CodeJam/wiki/M_CodeJam_EnumHelper_IsFlagSet__1
NN_

22

IdNidonocu

පවතින අගයන් සමූහයකට තවත් ධජයක් එක් කිරීමට, හෝ පැවරුම් ක්‍රියාකරු භාවිතා කරන්න.

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:

C # 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] ජයිම්ගේ අදහස බලන්න. අප අව්‍යාජව බිට්මාස්ක් කරන්නේ නම් , අපට අවශ්‍ය වන්නේ ප්‍රති result ලය ධනාත්මක දැයි පරීක්ෂා කිරීම පමණි. නමුත් enums negative ණාත්මක විය හැකි බැවින්, අමුතු ලෙස, ගුණාංගය සමඟ සංයෝජනය වන විට[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" භාවිතා කළ යුතුය.
කපුටා

A ජේම්පාර්ඩෝස් - අපි ඒවා අවංක බයිට් ලෙස තබා ගන්නා තාක් කල්, මෙම උදාහරණයේ දී මෙන්, .ණාත්මක සංකල්පයක් නොමැත. එම්එස්ඩීඑන් අනතුරු අඟවන පරිදි , "ඔබ negative ණ සංඛ්‍යාවක් ධජ ගණනය කළ නියතයක් ලෙස අර්ථ දක්වන්නේ නම් ප්‍රවේශම් වන්න. "Negative ණ බිට්ෆ්ලැග්" අනුව සිතීම පුදුමයකි! ; ^) මම තව ටිකක් සංස්කරණය කරන්නම්. නමුත් ඔබ හරි, අපි අපේ negative ණ අගයන් භාවිතා කරන්නේ නම් enum, අප විසින් පරීක්ෂා කළ != 0යුතුය.
රෆින්

10

ඔබේ ගණනය කිරීම් තුළ බිට්මාස්කිං භාවිතා කිරීමට කොඩි ඔබට ඉඩ දෙයි. ගණනය කර ඇති අගයන් ඒකාබද්ධ කිරීමට මෙය ඔබට ඉඩ සලසයි.

[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 [] {});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.