2009-04-21 16 views
9

यह क्यों है? मुझे लगता है कि यह है वास्तव में कुछ विस्तारित विधियों को बंद करने में सक्षम होने के लिए केवल मेरी कक्षाओं में से एक के भीतर उपयोग किया जा सकता है।नेस्टेड स्थैतिक कक्षाओं में एक्सटेंशन विधियों की अनुमति नहीं है?

कारण मैं इन विस्तार तरीकों चाहते हैं, क्योंकि यह है: स्पष्टीकरण के लिए पी


: नहीं वास्तव में हर जगह उपलब्ध कुछ विस्तार तरीकों करना चाहते हैं ... और वे ऐसा नियमित रूप से स्थिर तरीकों की तुलना में बहुत अच्छे लग रहे मैं एक फॉर्म बढ़ा रहा हूं, जिसमें डेटाग्रिड व्यू है। और मैं इस तरह की लाइनों के बहुत थक गया हो रही है:

foreach(var row in grid.Rows.OfType<DataGridViewRow>().Where(r => (bool) r.Cells[checkBoxColumn.Index].Value)) 

foreach(var row in grid.SelectedRows.OfType<DataGridViewRow>().Where(r => (bool) r.Cells[checkBoxColumn.Index].Value)) 

एक विस्तार विधि चाहेंगे ताकि मैं सिर्फ दूसरे शब्दों में कर सकता है

foreach(var row in grid.Rows.CheckedRows()) 

foreach(var row in grid.SelectedRows.CheckedRows()) 

तो, यह विस्तार विधि बिल्कुल उपयोगी नहीं होगा इस कक्षा के बाहर। लेकिन यह कोड को बहुत साफ कर देगा। निश्चित रूप से नियमित तरीकों को भी बना सकते हैं, और यही वह है जो मैंने कर दिया, क्योंकि यह संभव नहीं था।

आयनवे, मैं जानना चाहता था कि किसी के पास कुछ अच्छे तर्क थे कि क्यों उन्होंने इस तरह के प्रतिबंध लगाने का विकल्प चुना था, जहां एक्सटेंशन विधियों का उपयोग किया जा सकता था। एक स्थिर वर्ग में होना चाहिए कुल समझ में आता है। एक नेस्टेड स्थैतिक वर्ग में नहीं हो सकता है ... कम से कम ...

+0

ऐसा लगता है कि इनमें से कोई भी जवाब एक अच्छा तकनीकी कारण नहीं देता है कि यह क्यों नहीं किया जा सकता है। –

+0

आप की तरह, मैं एक्सटेंशन विधि वाक्यविन्यास को बहुत पसंद करता हूं। SomeThing.HasSomeCondition() HasSomeCondition (SomeThing) से बेहतर है। – Mir

उत्तर

1

एक विस्तार विधि का उपयोग करना वास्तव में आपके कोड को अपने वर्ग पर एक मानक सहायक विधि का उपयोग करने से बहुत साफ बना देगा?

// extension method 
foreach (var row in grid.Rows.CheckedRows()) 
foreach (var row in grid.SelectedRows.CheckedRows()) 

// standard helper method 
foreach (var row in CheckedRows(grid.Rows)) 
foreach (var row in CheckedRows(grid.SelectedRows)) 
+1

शायद नहीं। जब चीजें पीछे नहीं होतीं तो मुझे यह बेहतर लगता है। एक प्रकार का। हालांकि, शायद मुझे "ग्रिड -> पंक्तियों -> चेक किए गए लोगों" से "ग्रिड -> पंक्तियों के चेक किए गए" से मेरी सोच को समायोजित करने की आवश्यकता है ... हम्म ... लेकिन मुझे लगता है कि इस तरह का मोड़ एक व्यक्तिपरक में बदल जाता है कोडिंग शैली अब चीज की तरह। हालांकि अच्छा मुद्दा! =) इसे एक उत्तर के रूप में स्वीकार करेगा, जब तक कि कोई व्यक्ति माइक्रोसॉफ्ट से संबंधित "इस तरह के विचार" के साथ आता है। – Svish

+2

@ स्विस (बाद में रास्ता): यह (पूरी तरह से) व्यक्तिपरक नहीं है: गैर-एक्सटेंशन सिस्टैक्स खराब रूप से बना है क्योंकि अत्यधिक घोंसले (यानी खराब पठनीयता) का कारण बनता है। विस्तार वाक्यविन्यास पाठक-tailcalls का एक रूप है, यदि आप करेंगे :-) –

2

यदि आप एक प्रकार का विस्तार कर रहे हैं, तो एक्सटेंशन विधियों को स्वयं के रूप में सुलभ के रूप में सुलभ होना चाहिए।

सर्वोत्तम प्रथाएं सभी एक्सटेंशन विधियों को एक ही स्थान पर रखने का सुझाव देती हैं, अधिमानतः एक स्थिर वर्ग में या एक एकल नामस्थान में निहित होती है।

+5

एक ही स्थान पर सभी एक्सटेंशन विधियों को रखना एक ही स्थान पर सभी उपयोगिता विधियों को डालने जैसा बुरा विचार है। –

+0

यदि आप किसी प्रकार का विस्तार कर रहे हैं, तो किसी भी स्तर पर एक्सटेंशन विधियों को निश्चित रूप से प्रकार के रूप में सुलभ नहीं होना चाहिए? –

+3

मैं ओपी के साथ हूँ। अपने विस्तार विधियों के दायरे को सीमित करना अच्छा होगा। कभी-कभी आपको इस प्रकार के साथ क्या करने की ज़रूरत होती है केवल एक विशिष्ट परिदृश्य में लागू होती है लेकिन आप अभी भी विस्तार विधियों की सिंथेटिक चीनी का लाभ लेना चाहते हैं। – xr280xr

4

यदि आपके पास इस प्रकार का स्रोत कोड है, तो आप एक्सटेंशन विधियों का उपयोग क्यों कर रहे हैं? आप केवल उन एक्सटेंशन विधियों को स्वयं के प्रकार क्यों नहीं बनाते?

एक्सटेंशन विधियों का उपयोग उन प्रकारों को बढ़ाने के लिए किया जाता है जिन्हें आपने नहीं बनाया था। हालांकि वे उपयोगी उपकरण हैं, वे संकेत की एक परत हैं जो पहले के बजाय अंतिम उपाय होना चाहिए। जबकि आप अपने स्वयं के प्रकारों का विस्तार करने के लिए उनका उपयोग कर सकते हैं, यह आपके द्वारा बनाए गए प्रकारों के लिए उनके उपयोग को आरक्षित करने के लिए अधिक समझ में आता है।

+0

उम, बहुत यकीन है कि उसने DataGridView नहीं बनाया ;-) –

+2

हाय एंड्रयू। इस पर आपसे सहमत नहीं हो सकता। कुछ मामलों में यह मौजूदा वर्गों को व्यापक कार्यक्षमता के बिना अतिरिक्त कार्यक्षमता के साथ सजाने के लिए समझ में आता है। हम या तो प्राप्त कर सकते हैं, शायद एक सजावटी वर्ग बना सकते हैं या बस विस्तार विधियों का उपयोग कर सकते हैं और कुछ मामलों में, विस्तार विधियां यहां सहायता करती हैं। इस व्यवहार के लिए एकता, LINQ खुद और दूसरों को ले लो। –

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

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