.NET का अंतर्निहित फ्लैग एनम ऑपरेशन दुर्भाग्य से काफी सीमित है। अधिकांश समय उपयोगकर्ताओं को बिटवाइज ऑपरेशन लॉजिक का पता लगाने के लिए छोड़ दिया जाता है।
.NET 4 में, विधि HasFlag
जोड़ा गया था Enum
जो उपयोगकर्ता के कोड को सरल बनाने में मदद करता है लेकिन दुर्भाग्य से इसके साथ कई समस्याएं हैं।
HasFlag
टाइप-सुरक्षित नहीं है क्योंकि यह किसी भी प्रकार के एनम वैल्यू तर्क को स्वीकार करता है, न कि दिए गए एनम टाइप को।
HasFlag
यह मानने के लिए अस्पष्ट है कि क्या यह जाँच करता है कि मान में सभी या किसी भी झंडे के लिए मूल्य गणना तर्क द्वारा प्रदान की गई है। यह सब वैसे ही है।
HasFlag
बल्कि धीमा है क्योंकि इसमें मुक्केबाजी की आवश्यकता होती है जो आवंटन का कारण बनता है और इस प्रकार अधिक कचरा संग्रह होता है।
फ्लैग एनमों के लिए .NET .NET के सीमित समर्थन के कारण मैंने OSS लाइब्रेरी Enums.NET को लिखा, जो इनमें से प्रत्येक मुद्दे को संबोधित करता है और फ्लैग एनमों से निपटना बहुत आसान बनाता है।
नीचे कुछ संचालन दिए गए हैं, जो सिर्फ .NET फ्रेमवर्क का उपयोग करके अपने समकक्ष कार्यान्वयन के साथ प्रदान करते हैं।
झंडे मिलाएं
नेट flags | otherFlags
Enums.NET flags.CombineFlags(otherFlags)
झंडे हटाओ
नेट flags & ~otherFlags
Enums.NET flags.RemoveFlags(otherFlags)
आम झंडे
नेट flags & otherFlags
Enums.NET flags.CommonFlags(otherFlags)
झंडे गाड़ दो
नेट flags ^ otherFlags
Enums.NET flags.ToggleFlags(otherFlags)
सभी झंडे हैं
.नेट (flags & otherFlags) == otherFlags
याflags.HasFlag(otherFlags)
Enums.NET flags.HasAllFlags(otherFlags)
किसी भी झंडे है
नेट (flags & otherFlags) != 0
Enums.NET flags.HasAnyFlags(otherFlags)
झंडे जाओ
नेट
Enumerable.Range(0, 64)
.Where(bit => ((flags.GetTypeCode() == TypeCode.UInt64 ? (long)(ulong)flags : Convert.ToInt64(flags)) & (1L << bit)) != 0)
.Select(bit => Enum.ToObject(flags.GetType(), 1L << bit))`
Enums.NET flags.GetFlags()
मैं इन सुधारों को .NET कोर में शामिल करने की कोशिश कर रहा हूँ और शायद पूर्ण .NET फ्रेमवर्क। आप यहां मेरे प्रस्ताव की जांच कर सकते हैं ।