2011-08-20 11 views
6

MSDN documentationFlag विशेषता के लिए की शक्ति के बिना झंडा enums का कहना है कि आप करना चाहिए:दो मानों

दो की शक्तियों में शुमार स्थिरांक को परिभाषित करें, कि, है 1, 2, 4, 8, और इतने पर । इसका मतलब है कि संयुक्त गणना स्थिरांक में व्यक्तिगत झंडे ओवरलैप नहीं होते हैं।

... और निश्चित रूप से मैं हमेशा ऐसा करने की याद रखने की कोशिश करता हूं। हालांकि, कुछ भी नहीं है कि लागू करने और अगर आप सिर्फ 'बेसिक' जिस तरह की तरह एक गणन बनाने ...

[Flags] 
public enum BrokenEnum 
{ 
    None, 
    FirstOption, 
    SecondOption, 
    ThirdOption 
} 

... यह अपेक्षा के अनुरूप व्यवहार नहीं होंगे। इसका मुकाबला करने के लिए, मैं किसी प्रकार का स्थैतिक कोड विश्लेषण (जैसे FxCop) की तलाश में हूं जो मुझे चेतावनी दे सकता है जब मेरे कोड में उपरोक्त की तरह एक enum मौजूद है। मुझे लगता है कि निकटतम ऐसी चेतावनी 'CA1008: Enums should have zero value' थी - जो झंडे की गणना को सही ढंग से डिजाइन करने में भी सहायक है लेकिन पर्याप्त नहीं है।

मेरे कोड में ग़लत ढंग से डिज़ाइन किए गए झंडे को खोजने का सबसे अच्छा तरीका क्या है? अधिक स्वचालित समाधान, बेहतर।

उत्तर

2

जैसा कि जैकब कहता है, यह झंडे के मिश्रण के लिए उपयोगी हो सकता है ... लेकिन संभवतः आप संकेत दे सकते हैं कि किसी भी तरह से आपका पता लगाने से कोई फर्क नहीं पड़ता।

यह बहुत मुश्किल एक इकाई परीक्षण जो वहाँ 0 (संभवतः यह सुनिश्चित यह None या Default कहा जाता है) के लिए एक मूल्य है कि एक विधानसभा [Flags] और चेक के साथ सजाया में हर enum माध्यम से चला जाता लिखने के लिए नहीं होना चाहिए और हर दूसरे परिभाषित मूल्य कि (Enum.GetValues() से) दो की शक्ति है। आप if ((x & (x - 1)) == 0) का उपयोग करके जांच सकते हैं।

संभावित रूप से संयोजनों के लिए डिज़ाइन किए गए मानों को इंगित करने के लिए आपको [Combination] विशेषता हो सकती है ... वे यह भी संकेत दे सकते हैं कि वे किस ध्वज नाम के संयोजन के लिए हैं, ताकि आप इसे भी देख सकें।

मुझे पता है कि यह एक संकलन-समय की जांच के रूप में काफी अच्छा नहीं है, लेकिन यह मानते हुए कि आप नियमित रूप से परीक्षण चला रहे हैं, यह बहुत करीब है।

+1

मुझे लगता है कि मुझे स्थिर कोड विश्लेषण के 'बॉक्स के अंदर' नहीं सोचना चाहिए था। इस तरह एक यूनिट परीक्षण बहुत आसान होना चाहिए और मुझे लगभग एक ही अंतिम परिणाम देना चाहिए। –

3

कभी-कभी आप एक झंडे enum रखना चाहते हैं जो कई विकल्पों का प्रतिनिधित्व करता है; इस तरह के मामलों में, यह कोई त्रुटि नहीं है। यहां एक सामान्य उदाहरण है:

[Flags] 
public enum FilePermissions 
{ 
    None = 0, 
    Read = 1, 
    Write = 2, 
    Execute = 4, 

    ReadWrite = 3, // Read | Write, 
    ReadWriteExecute = 7 // Read | Write | Execute 
} 

शायद क्योंकि इस तरह के मामलों का समर्थन करने की आवश्यकता है, यही कारण है कि एक संकलक एक चेतावनी या त्रुटि का कारण नहीं है।

+0

मैं कारण देख सकता हूं कि संकलक ऐसा क्यों नहीं करता है (पीछे की संगतता, अनुचित जटिलता इत्यादि भी सोच रहा है) इसलिए मैं ठीक हूं कि आपको संकलक चेतावनी नहीं मिलती है। लेकिन मैं अभी भी चेतावनी देने का एक तरीका ढूंढ रहा हूं। आपके जैसे मामलों में उपयोग वैध था, आप 'SuppressMessage' विशेषता' जैसे कुछ के साथ निरीक्षण अक्षम कर सकते हैं। –

+0

आप अधिक विस्तृत झंडे भी ले सकते हैं। उदाहरण के लिए '{व्यू = 1, ऑल्टर = 2, एक्शन = 4 | देखें | बदलें} ': इस प्रकार एक आइटम को क्रियान्वित करने के लिए आपको आवश्यकता है और बदलें; सही के अलावा। –

3

मैंने इसे कभी भी कोशिश नहीं की, लेकिन शायद आप FxCop के लिए एक कस्टम नियम लिख सकते हैं।

FxCop and Code Analysis: Writing Your Own Custom Rules देखें।

+0

धन्यवाद, यह बहुत ही आशाजनक प्रतीत होता है।मैं जॉन स्कीट के जवाब से चिपक सकता हूं क्योंकि मुझे लगता है कि एक कस्टम एफएक्सकॉप नियम लिखने के बजाय सीखने के बजाय यूनिट टेस्ट लिखने के लिए यह अल्पावधि में तेजी से होगा। –

संबंधित मुद्दे