[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. यह इन झंडे के साथ बेकार हो जाएगा।
यहाँ एक सही घोषणा का एक उदाहरण है:
[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
इसी तरह, जब आपने बाइनरी बिटवाइज़ या ऑपरेटर का उपयोग करके अपनी संपत्ति AllowedColors को Red, Green और Blue में सेट किया है |
, तो AllowedColors इस तरह दिखता है:
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 पर झंडे को डिजाइन