एक टिप्पणी के लिए बहुत लंबा:
वास्तव में, [Flags]
विशेषता एक enum का अर्थ विज्ञान बिल्कुल नहीं बदलता है, यह सबसे लोकप्रिय ToString
विधि द्वारा प्रयोग किया जाता है बल्कि एक संयुक्त मूल्य के लिए एक नंबर से नामों की एक श्रृंखला फेंकना ।
मान लें कि आपका enum (Flags
विशेषता के बिना) इस तरह घोषित किया गया था दो:
enum TicketStatus
{
Created = 1,
Transferred = 2,
Sold = 4
}
तुम अब भी विभिन्न सदस्यों को संयोजित करके झंडे enum पर लागू होता है कि किसी भी गणित कर सकता है:
TicketStatus status = TicketStatus.Created | TicketStatus.Transferred;
हालांकि, निम्नलिखित प्रिंट करेंगे:
Console.WriteLine(status);
लेकिन यदि आप [Flags]
विशेषता जोड़ते हैं, तो यह Created, Transferred
प्रिंट करेगा।
इसके अलावा, यह ध्यान रखें कि TicketStatus.Created | TicketStatus.Transferred
से तुम सच में अंतर्निहित पूर्णांक मान पर एक बिटवाइज़ OR
कर रहे हैं महत्वपूर्ण है, ध्यान दें कि किस हमारे उदाहरण में जो नियत मूल्यों स्पष्ट combinable हैं:
Created : 0001
Transferred: 0010
Sold: 0100
इसलिए एक मूल्य को Created
और Transferred
के संयोजन के रूप में निर्विवाद रूप से निर्धारित किया जा सकता है।लेकिन अगर हम इस किया था:
enum TicketStatus
{
Created = 1, // 0001
Transferred = 2, // 0010
Sold = 3, // 0011
}
यह बाइनरी अभ्यावेदन द्वारा स्पष्ट है, मूल्यों के संयोजन और सदस्यों के खिलाफ जाँच समस्याग्रस्त है के रूप में संयुक्त सदस्यों अस्पष्ट हो सकता है के रूप में। जैसे status
क्या है?
status = TicketStatus.Created | TicketStatus.Transferred;
यह Created, Transferred
है या यह वास्तव में Sold
है? हालांकि, यदि आप इसे करने का प्रयास करते हैं तो संकलक शिकायत नहीं करेगा, जिससे आपकी तरह की बग को ट्रैक करने में कठिनाई हो सकती है, जहां कुछ चेक काम नहीं कर रहे हैं, जैसा कि आप उम्मीद करते हैं, इसलिए यह सुनिश्चित करना आपके लिए परिभाषा है थोड़ा सा मिश्रण और तुलना करना।
:
एक संबंधित नोट पर, के बाद से अपने if
बयान वास्तव में केवल जाँच कर रहा है, तो टिकट एक Created
का दर्जा प्राप्त है, की परवाह किए बिना अन्य सदस्यों के साथ संयुक्त किया जा रहा है, यहाँ के लिए कि (.NET> = 4) की जांच करने के लिए एक बेहतर तरीका है
status.HasFlag(TicketStatus.Created)
या (.NET < 4):
(status & TicketStatus.Created) != 0
क्यों अपने enum अपेक्षा के अनुरूप काम नहीं किया था के रूप में, यह लगभग निश्चित रूप से, क्योंकि आप स्पष्ट रूप से मैं करने के लिए unambigously बिटवाइज़ combinable मान निर्दिष्ट नहीं किया है टीएस सदस्यों (आमतौर पर दो की शक्तियां)।
'टिकटस्टैटस 'कैसा है? क्या यह 'झंडे] विशेषता के साथ एक enum है? – MarcinJuraszek
'टिकट' स्थिति का मूल्य क्या होता है जब यह विफल रहता है, लेकिन आप उम्मीद करते हैं कि 'सत्य' होना चाहिए? –
दिलचस्प ... अगर मैं enum को चारों ओर शामिल करता हूं (उदाहरण के लिए। '(टिकटस्टैटस.क्रेटेड | टिकटस्टैटस। ट्रांसफर) ") ऐसा लगता है। Enum होने के नाते एक 'बाइट' ध्वज आधारित आधारित enum है, मैंने सोचा होगा कि इससे कोई फर्क नहीं पड़ता? .. कोई विचार क्यों? –