2009-01-06 3 views
23

मुझे FxCop warning CA1006, माइक्रोसॉफ्ट के साथ परेशानी हो रही है। "DoNotNestGenericTypesInMemberSignatures" डिज़ाइन करें। विशेष रूप से, मैं वर्ग को ReadOnlyCollection<Report<T>> से प्राप्त करता हूं, और इसके public कन्स्ट्रक्टर पैरामीटर के रूप में IList<Report<T>> लेता है।क्या FxCop चेतावनी CA1006 के लिए कोई अच्छा कामकाज है?

इस चेतावनी ठीक करने के लिए सुझाव बहुत उपयोगी नहीं है:

"इस नियम का उल्लंघन ठीक करने के लिए, डिजाइन को बदलने नेस्टेड प्रकार तर्क हटाने के लिए।"

  1. निर्माता internal बनाओ: वहाँ के रूप में सुझाव डिजाइन को बदलने के लिए दो तरीके मैं अब तक देख सकते हैं कर रहे हैं। यह मेरे मामले में काम नहीं करता है। कन्स्ट्रक्टर public होना चाहिए क्योंकि इस संग्रह वर्ग को असेंबली के बाहर कोड द्वारा तत्काल आवश्यकता होनी चाहिए।
  2. निर्माता को IList<Report<T>> के बजाय Report<T>[] ले जाएं। यह उप-इष्टतम है क्योंकि बाह्य कोड में गतिशील आकार के डेटा संरचनाओं का उपयोग करने की लचीलापन होनी चाहिए जैसे कि निश्चित आकार के सरणी के बजाय List<T>

इस बिंदु पर, मैंने इस चेतावनी को छोड़ दिया है और दबा दिया है। क्या कोई बेहतर समाधान है?

उत्तर

20

मैं मानता हूँ, एक और अच्छा समय इस नियम की अनदेखी करने के लिए जब आप कहते हैं की जरूरत है आईन्यूमेरेबल (गैर-जेनेरिक) लागू करता है। जेनेरिक (भाग में) का उद्देश्य उन प्रकारों को प्रतिबंधित करना है जो किसी दिए गए सेट के लिए अनुमत हैं।

मुझे लगता है कि यह नियम बहुत बेवकूफ है। केवल तभी इसकी आवश्यकता है यदि आपके पास कई सामान्य प्रकार के घोंसले हैं। घोंसले की एक परत सुरक्षित से अधिक है।

Btw, मैं LINQ कार्य घोंसला का एक बहुत सामान्य प्रकार के रूप में अच्छी तरह लगता है, इसलिए यदि एमएस यह होता है, हम भी कर सकते हैं :)

+3

मैं घोंसले के "सुरक्षित" स्तर पर कोई सीमा नहीं डालूंगा। जेनेरिक प्रकारों को नेस्टेड किया जाना चाहिए हालांकि गहराई से अर्थशास्त्र की आवश्यकता होती है। कॉन्वर्सिस और contravariance के लिए इंटरफेस के समर्थन पर सीमाओं का मतलब है कि कोड जो अपेक्षा करता है उदा। एक 'IDictionary >' आईडीआईआर <स्ट्रिंग, सूची > 'स्वीकार करने में सक्षम नहीं होगा, लेकिन जब नेस्टेड जेनेरिक अर्थात् सही होते हैं तो मैं उनके आसपास काम करने की कोशिश करने के बजाय उनका उपयोग करने का पक्ष लेता हूं। – supercat

30

मैं FxCop की चेतावनियां लेता हूं जैसे कि वे बेहद गुदा-प्रतिद्वंद्वी सहकर्मी से सुझाव थे। यह सुझाव देता है कि कुछ चीजों को अनदेखा करना (दबाना) ठीक है।

Func<IEnumerable<T>> 
निश्चित रूप से

आप इस्तेमाल कर सकते हैं गैर सामान्य IEnumerable, लेकिन फिर किसी भी प्रकार के रूप में लंबे समय के रूप में इस्तेमाल किया जा सकता है:

+2

+1 यह भी एक डिजाइन चेतावनी है, तो कभी कभी ये वास्तव में सौंदर्य खासकर यदि आप एक डिजाइनिंग नहीं कर रहे हैं के रूप में वर्गीकृत किया जा सकता है सार्वजनिक एपीआई –

4

मैं मानता हूँ कि आप

के मामले में CA1006 चेतावनी को अनदेखा कर सकते हैं
Func<IEnumerable<T>> 

इसके अलावा, आप प्रतिनिधियों का उपयोग करके अपने कोड को सरल बनाने और CA1006 बच सकते हैं:

public delegate IEnumerable<T> ChildrenDel<T>(T parent); 

// was: GetDescendants<T>(this T item, Func< T, IEnumerable<T> > children) 

public static IEnumerable<T> GetDescendants<T>(this T item, ChildrenDel<T> children) 
{ 
    var stack = new Stack<T>(); 
    do { 
     children(item).ForEach(stack.Push); 

     if(stack.Count == 0) 
      break; 

     item = stack.Pop(); 

     yield return item; 
    } while(true); 
} 
+0

'Func <>' के बजाय प्रतिनिधियों का उपयोग करने में समस्या यह है कि विजुअल स्टूडियो आपको एक ही पॉपअप में एक कस्टम प्रतिनिधि की परिभाषा के बारे में संकेत नहीं देगा क्योंकि पैरेंट फ़ंक्शन हस्ताक्षर - जबकि 'Func' अनुमान लगाने के लिए सरल है के लिए lambda। अनुमोदित, यह एक भाषा मुद्दे के बजाय एक आईडीई मुद्दा है। – Dai