2010-03-26 11 views
14

क्या आप अपने सभी एक्सटेंशन विधियों के लिए वैश्विक, कैचल नेमस्पेस का उपयोग करते हैं, या क्या आप एक्सटेंशन विधियों को उसी नामस्थान में रखते हैं जैसे वे कक्षा (एस) का विस्तार करते हैं?आप अपने एक्सटेंशन विधियों के नामस्थान कैसे प्रबंधित करते हैं?

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

मैं पूछता हूं क्योंकि मुझे System.Security.Principal.IIdentity का विस्तार करने की आवश्यकता है, और System.Security.Principal नामस्थान में विस्तार विधि को समझने की प्रतीत होती है, लेकिन मैंने इसे कभी भी ऐसा नहीं देखा है।

उत्तर

8

मैं एक ही नाम स्थान में अपने सभी विस्तार तरीकों डालने की सिफारिश करेंगे (संयोग से यह भी है कि क्या माइक्रोसॉफ्ट 'System.Linq' नाम स्थान के अंदर एक भी वर्ग 'एक्सटेंशन' में उन्हें रख कर Linq के साथ किया था)।

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

+2

यह 'System.Linq' के साथ समझ में आता है, क्योंकि उन सभी विस्तार विधियों को अवधारणात्मक रूप से 'System.Linq' से संबंधित है। –

+0

तो आपके आकलन के अनुसार, मेरे सिस्टम को 'System.Security.Principal.Extensions' में डालकर भी समझ में आता है? –

+1

यह बहुत ही बेवकूफ हो सकता है, लेकिन क्या आपको बहुत अधिक अतिव्यापी ओवरहेड नहीं होता है जब आपको केवल क्लास फ़ाइल पर एक एक्सटेंशन विधि की आवश्यकता होती है, जबकि आपके नेमस्पेस में दर्जनों हो सकते हैं? –

8

यदि वे समाधान के दौरान उपयोग की जाने वाली विस्तार विधियां हैं (उदाहरण के लिए 60% से अधिक वर्ग), तो मैंने उन्हें समाधान के आधार नामस्थान में रखा है (क्योंकि वे स्वचालित रूप से मूल नामस्थान में आयात किए जाएंगे, कोई आयात नहीं करेंगे हर बार आम सामान)।

इस श्रेणी में, जैसी चीजों:
.IsNullOrEmpty(this string value) और .HasValue(this string value)

हालांकि, अगर वे बहुत विशिष्ट और शायद ही कभी इस्तेमाल कर रहे हैं, मैं उन्हें एक BaseNamepace.Extensions नाम स्थान ताकि वे मैन्युअल रूप से आयात किया जाना चाहिए में डाल दिया और नहीं दिखा इंटेलिजेंस में हर जगह चीजों को छेड़छाड़ करना।

13

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

  • यदि आप उरी के लिए एक एक्सटेंशन लिख रहे हैं, तो सिस्टम में एक्सटेंशन डालें।
  • यदि यह डेटासेट के लिए एक विस्तार है, तो इसे System.Data में रखें।

साथ ही, Microsoft विस्तार तरीकों के बारे में इस का कहना है:

सामान्य तौर पर, हम अनुशंसा करते हैं कि आप विस्तार तरीकों किफ़ायत से और केवल आपके लिए है जब लागू। जब भी संभव हो, तो क्लाइंट कोड जो को मौजूदा प्रकार का विस्तार करना चाहिए मौजूदा प्रकार से व्युत्पन्न एक नया प्रकार बनाना चाहिए।

विस्तार विधियों के बारे में अधिक जानकारी के लिए, विस्तार विधियों के बारे में the MSDN page देखें।

+0

मैंने इसे थोड़ी देर पहले किया था, लेकिन फिर बैक-पेडल किया गया था, अब मुझे याद नहीं है क्यों :( – Benjol

+0

मैं दो कारणों से अपने एक्सटेंशन को उसी नामस्थान में नहीं डालता हूं। सबसे पहले यह संघर्ष में भागना नहीं चाहता नामस्थानों के भविष्य के संस्करण जिनके पास मेरा स्वामित्व नहीं है। इसलिए, उरी के लिए मेरा विस्तार CodeCharm.System.Extensions में होगा। दूसरा यह है कि मैं इसे आसानी से खोजना चाहता हूं, जबकि मैं जिस विधि में हूं, वह कक्षा का हिस्सा नहीं है * दिखाई देता है * यह केवल कॉल स्टैक के शीर्ष पर बैठे विधि कॉल पर आधारित है। –

1

मैंने उपयोगकर्ता 276695 से उत्तर को ऊपर उठाया जो सबसे आसान समाधान प्रतीत होता था। हालांकि मुझे एक बेहतर समाधान मिला: कोई नामस्थान बिल्कुल नहीं। आप एक फ़ाइल के बहुत जड़ में विस्तार के तरीकों के साथ एक स्थिर वर्ग डाल सकते हैं, यह आसपास किसी भी नाम स्थान घोषणा लपेटकर के बिना। फिर विस्तार तरीकों किसी भी नाम स्थान का उपयोग करके आयात करने के लिए/के बिना उपलब्ध हो जाएगा। †

मैं नाम स्थान नाजियों से नीचे मतदान होने के बारे में थोड़ा चिंतित हूँ। लेकिन मैं एक से थोड़ा अपरंपरागत स्थिति चैंपियन के लिए मजबूर महसूस करते हैं।कम से कम मेरे काम की लाइन (आईटी) में मुझे लगता है कि मेरे अधिकांश कस्टम टूल नामस्थानों के बिना बनाए रखना आसान है, और सबकुछ एक विशाल अज्ञात नेमस्पेस में रखना है। मुझे यकीन है कि अन्य प्रोग्रामिंग सार्वभौमिक हैं जहां यह भी काम नहीं करेगा। लेकिन & परिस्थितियों में भिन्नताएं हैं, मैं बस यह इंगित करना चाहता था कि आप वास्तव में नामस्थानों के बिना कक्षाएं घोषित कर सकते हैं, यहां तक ​​कि विस्तार विधियों वाले वर्ग भी - जिनके लिए एक विशाल अनाम नामस्थान भी बेहतर है।

† आप भी एक स्तर का इंडेंटेशन सहेजने के लिए मिलता है। :-) और यहां तक ​​कि 3 विशाल मॉनीटर के साथ मैं हमेशा स्क्रीन रीयल-एस्टेट को सहेजने के तरीकों की तलाश में हूं।

+0

मैं निश्चित रूप से इसे लक्षित वर्ग के नामस्थान में डालकर पसंद करता हूं। लेकिन मुझे अभी भी यकीन नहीं है कि यह किसी प्रोजेक्ट पर बेहतर है या नहीं/समाधान विशिष्ट नामस्थान।वर्तमान में मैं इसे एप्लिकेशन कोड में उपयोग कर रहा हूं लेकिन लाइब्रेरी कोड में इसे से बचें। (जहां लाइब्रेरी को पूरी तरह से अलग-अलग समाधानों में संभवतः पुन: प्रयोज्य के रूप में परिभाषित किया गया है, संभवतः तीसरे पक्ष द्वारा, डीएल के रूप में संकलित सब कुछ नहीं।) – CodesInChaos

+0

हाँ पुस्तकालयों के पास नामस्थान के लिए एक मजबूत आवश्यकता है, क्योंकि आप उन सभी परियोजनाओं को नहीं जानते हैं जो अंत में उनका उपयोग करेंगे । हालांकि, यहां तक ​​कि मेरे निजी पुस्तकालयों के साथ मैंने किसी भी नामस्थान का उपयोग करना छोड़ना शुरू कर दिया है, और अब तक मैंने किसी भी परिस्थिति में भाग नहीं लिया है जहां इससे कोई समस्या हुई है। अगर मैं अपने पुस्तकालयों को अधिक साझा करता हूं, या उन्हें बेच रहा था तो शायद यह अलग होगा। बीटीडब्ल्यू, स्टूडियो का नाम बदलें (एफ 2) सुविधा अद्भुत है। ऐसा लगता है कि मेरे सभी नाम टकराव (आमतौर पर स्थानीय चर, या फ़ील्ड/गुण - और शायद ही कभी कक्षा के नाम) का ख्याल रखना प्रतीत होता है। –

0

मेरा अभ्यास एक्सटेंशन को ऐसे नामस्थान में रखना है जो अभी तक स्पष्ट रूप से स्रोत नामस्थान की पहचान करता है जो मैं विस्तार कर रहा हूं।

आम तौर पर, मैं नाम स्थान मैं विस्तार कर रहा हूँ के सामने मेरी "कंपनी नाम" नाम स्थान पथ का हिस्सा लगाकर द्वारा एक नाम स्थान बनाने के लिए, और फिर ".Extensions"

उदाहरण के लिए, अगर मैं के साथ प्रत्यय मैं विस्तार कर रहा हूं (कोई अच्छा कारण नहीं) ::System.Text.StringBuilder क्योंकि यह मुहरबंद है, तो मैं अपने एक्सटेंशन को नेमस्पेस ::CodeCharm.System.Text.Extensions में रखूंगा।

जब मैं एक्सटेंशन करता हूं तो यह अंगूठे का नियम है, मुझे संदेह है कि मैं उन समाधानों को अन्य समाधानों में दोबारा उपयोग कर सकता हूं।

0

यदि आप उन्हें अपने वर्तमान से अधिक नामस्थान में डालते हैं, तो वे स्वचालित रूप से दिखाई देंगे।

तो अगर आप की तरह की परियोजनाओं के लिए नामस्थान है:

AdventureWorksInc.Web 
AdventureWorksInc.Logic 
AdventureWorksInc.DataAccess 

फिर अपने विस्तार सीधे में घोषित:

namespace AdventureWorksInc 
{ 
    public static class HtmlHelpers 
    { 
     public static string AutoCloseHtmlTags(this string html) 
     { 
      //... 
     } 

    } 
} 

इस विस्तार विधि दिखाई देगा जब भी आप किसी भी उप नाम अंतरिक्ष में कोड लिख रहे हैं एक साहसिक कथन की आवश्यकता के बिना AdventureWorksInc का।

हालांकि, उपरोक्त विस्तार संभावित डाउनसाइड प्रदर्शित करता है। तथ्य यह है कि यह तारों पर चल रहा है, यह अब सभी तारों के लिए एक विस्तार विधि के रूप में दिखाई देगा, जिनमें वास्तव में HTML नहीं हैं। यह वास्तव में नामस्थान स्कोपिंग के साथ कोई मुद्दा नहीं है, लेकिन केवल एक विस्तार विधि का दुरुपयोग है। यह एक नियमित स्थैतिक होना चाहिए जिसके लिए मानक पैरामीटर की आवश्यकता होती है ताकि कॉल स्पष्ट हो।

उचित टाइप किए गए पैरामीटर के साथ आम तौर पर अच्छी तरह से डिज़ाइन किए गए एक्सटेंशन विधियां उन प्रकारों पर दिखाई नहीं देगी जो यह कभी लागू नहीं होंगी।

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