2011-10-17 15 views
6

मैंने सोचा कि निम्नलिखित करने का अर्थ है, लेकिन यह संभव नहीं है और एक त्रुटि फेंक दी जाएगी: The namespace 'foo' already contains a definition for 'bar'नामस्थान के नाम से नामस्थान

namespace foo 
{ 
    public class bar { ... } 
} 

namespace foo.bar 
{ 
    public class baz : EventArgs { ... } 
} 

इस तरह के मामले के लिए नेमस्पेस नामकरण का उचित तरीका क्या होगा?

+3

व्यावहारिक उदाहरण के बिना, सुझावों को शिक्षित अनुमान बनाना होगा, सभी संभावित आधारों को कवर करना होगा, या एक महान उत्तर होने से कम होना होगा; अंगूठे के नियम से, एक नामस्थान एक श्रेणी है, या सामान्यीकरण, और एक वर्ग एक विशिष्ट उपयोगिता है - नामकरण इसे प्रतिबिंबित करना चाहिए। उदाहरण के लिए 'System.Collections' नामस्थान और कक्षाएं, जैसे 'System.Collections.CollectionBase'। अगर इस नामस्थान में 'संग्रह 'नामक कक्षा के लिए आवश्यकता थी तो कुछ और गलत है। –

+0

यह एक व्यावहारिक उदाहरण कम या कम है। मैं वर्ग 'बार' में 'EventArgs' के आधार पर एक कस्टम प्रकार का उपयोग करना चाहता हूं। क्या मुझे कस्टम नाम को उसी नामस्थान में 'बार' के रूप में रखना चाहिए? – Stijn

उत्तर

4

यह वास्तव में आप क्या हासिल करने की कोशिश कर रहे हैं पर निर्भर करता है।

:

namespace foo 
{ 
    public class bar 
    { 
     public class baz : EventArgs { ... } 
    } 
} 

अब आप के रूप में एक नया उदाहरण बना सकते हैं: क्या आप वास्तव में चाहते हैं baz foo.bar नेमस्पेस के अंतर्गत बैठने के लिए है क्योंकि यह निर्भर है/बारीकी से आप बार यह पट्टी के एक बच्चे के वर्ग बना सकते हैं जुड़ा हुआ

var test = new foo.bar.baz(); 
+0

ऐसा लगता है कि मैं क्या हासिल करना चाहता हूं। एक बार मुझे अनुमति देने के बाद स्वीकार करेंगे। इसके पीछे तकनीकी स्पष्टीकरण के लिए – Stijn

4

आपको नामस्थान या कक्षा का नाम के लिए दूसरा नाम ढूंढना होगा। इसके चारों ओर कोई रास्ता नहीं है।

उपयुक्त नामकरण ढूँढना मुश्किल है लेकिन किया जा सकता है।

1

उसी नामस्थान में एक ही कक्षा नाम होना संभव नहीं है। यदि आपके नामस्थान बहुत समान दिखते हैं, तो आप शायद उन्हें एक ही नामस्थान में चाहते हैं। यदि ऐसा नहीं है तो आपको शायद नामों के भीतर अपनी कक्षाओं के लॉजिकल वर्गीकरण पर पुनर्विचार करना होगा।

+1

सहमत, '।' एक नामस्थान में लाइन के नीचे भ्रम पैदा करने के लिए बाध्य है। – christofr

0

namespace foo_bar 
{ 
    public class baz : EventArgs { ... } 
} 

हो सकता है अन्यथा यह संभव नहीं है

7

आपको समझना होगा कि सीएलआर के संदर्भ में, नामस्थान जैसी कोई चीज़ नहीं है। नेमस्पेस पूरी तरह से एक भाषा सुविधा है जो केवल कोड को सरल बनाने के लिए मौजूद है ताकि हमें हमेशा पूरी तरह से योग्य क्लास नाम हमेशा पढ़ना न पड़े। foo और foo.bar -

अपने उदाहरण में,

namespace foo 
{ 
    public class bar { ... } 
} 



namespace foo.bar 
{ 
    public class baz : EventArgs { ... } 
} 

जब इस sourcecode संकलित किया गया है, आईएल नहीं भी पता दो नामस्थान देखते हैं कि है। इसके बजाय यह केवल कक्षा परिभाषाओं के बारे में जानता है। इस मामले में, जब यह कक्षा बार में आता है, तो यह जानता है कि आपके पास foo.bar

क्लास बाज़ में आता है, तो को वर्ग का पूरा नाम foo.bar के रूप में हल करता है। बाज़

लेकिन यदि यह मामला था, तो बाज़ को बार की कक्षा परिभाषा के भीतर सही तरीके से घोषित किया जाना चाहिए था और जैसा कि आपने यहां किया है, एक अलग नामस्थान में नहीं।

+0

+1। – Stijn

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