2010-12-15 12 views
16

मैं सी # में आंतरिक पहुंच संशोधक को समझने की कोशिश कर रहा हूं। मुझे समझ में नहीं आ रहा है कि एक असेंबली वास्तव में क्या है, और उस असेंबली के अंदर मेरे कार्यक्रम का कौन सा हिस्सा आयोजित किया जाता है। मैं इतना है कि एक चर निम्नलिखित नाम स्थान के अंदर ही वस्तुओं से accessibly है इसे बनाने के लिए कोशिश कर रहा था:सी # असेंबली, असेंबली में क्या है?

namespace Engine.Entity 

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

+2

"नेट परावर्तक" कार्यक्रम पर एक नज़र डालें। यह आपको एक असेंबली खोलने देगा और इसमें क्या होगा। आप देखेंगे कि एक एकल असेंबली में कई नामस्थान हो सकते हैं। – David

उत्तर

19

नामस्थान केवल नाम समाधान को प्रभावित करते हैं। नेमस्पेस किसी भी तरह का भंडारण नहीं दर्शाता है, न ही नामस्थान निर्धारित करता है कि कौन से डीएलएल में आपका कोड होता है। नेमस्पेस आपको लॉजिकल नाम के तहत संबंधित चीजों को एक साथ समूहित करने की अनुमति देता है भले ही वे भौतिक रूप से विभिन्न डीएलएल में रह सकें।

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

आप अपना कोड किसी प्रोजेक्ट (csproj) में संकलित करके एक विशेष असेंबली में डालते हैं जो DLL या EXE उत्पन्न करता है।

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

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

+0

"एक असेंबली मूल रूप से एक डीएलएल या EXE है।" सच है, लेकिन कभी-कभी यह किसी भी प्रकार की फ़ाइल (जेपीजी, टेक्स्ट फाइल इत्यादि) या कई एक ही समय में हो सकता है। हालांकि यह एज मामला है (इस पोस्ट पर मेरा जवाब देखें)। –

+0

हां, एक असेंबली चीजों की पूरी गड़बड़ी हो सकती है। इस प्रश्न के स्तर के लिए प्रासंगिक नहीं है। – dthorpe

1

internal (C# Reference)

आंतरिक कीवर्ड से प्रकार और प्रकार के सदस्यों के लिए एक पहुँच संशोधक है। आंतरिक प्रकार या सदस्यों सुलभ केवल एक ही विधानसभा

में फ़ाइलों के भीतर कर रहे हैं तो यह एक ही विधानसभा/DLL, नहीं namespace के भीतर से मतलब है।

0

असल में, आप किसी दिए गए नामस्थान से केवल एक चर दृश्यमान नहीं बना सकते हैं। किसी को भी किसी भी नाम स्थान को परिभाषित कर सकते हैं, यह internal शून्य के विचार होगा: तुम सिर्फ लिखने के लिए

namespace System 
{ 
    public static MySystemInternalSpy 
    { 
     public static void SpyInternals() 
     { 
      ... 
     } 
    } 
} 

उदाहरण के लिए, किसी भी चर, वर्ग या विधि System नाम स्थान में internal के रूप में परिभाषित करने के लिए पहुँच प्राप्त करने के लिए होगा।

0

नामस्थान और असेंबली समानार्थी नहीं हैं। अक्सर एक नामस्थान कई असेंबली फैलता है। विजुअल स्टूडियो से बनाए गए किसी भी प्रबंधित कोड में परियोजनाओं के एक corresponce के लिए डीएलएल/EXE बाइनरी में असेंबली के लिए एक है।

हालांकि, अगर आप कमांड लाइन के साथ अपने प्रबंधित कोड को लिंक करते हैं, तो आप एक असेंबली बना सकते हैं जहां कई प्रोजेक्ट फ़ाइलें सभी एक असेंबली से संबंधित होती हैं (जिसका अर्थ है कि आपकी डिस्क पर कई फाइलें एक साथ असेंबली का प्रतिनिधित्व करती हैं)। लेकिन इस मामले को कभी भी ध्यान न दें, यह एक गूढ़ चीज है जो अभ्यास में कभी नहीं होती है।

'आंतरिक' पहुंच मॉडिफर का अर्थ यह है कि लक्ष्य केवल उस असेंबली के भीतर से ही पहुंचा जा सकता है। इसका नामस्थानों पर कोई असर नहीं है।

5

लोगों को नामस्थान/असेंबली चीज़ द्वारा आसानी से उलझन में डाल दिया जाता है, क्योंकि यह आपके कोड को शारीरिक रूप से स्थित (असेंबली) और आप इसका संदर्भ कैसे देते हैं, इसकी अवधारणा को रद्द कर देता है (तर्कसंगत संदर्भ नामस्थान का उपयोग करके है और भौतिक संदर्भ संदर्भ द्वारा है सभा)।

मैं आमतौर पर शब्द contribute का उपयोग कर यह समझाने:

  1. एक विधानसभा कई नामस्थान के लिए योगदान कर सकते हैं।
    उदाहरण के लिए, System.Data.dll असेंबली System.Data जैसे नामस्थानों में योगदान देता है (उदा। कक्षा System.Data.DataTable) और Microsoft.SqlServer.Server (उदा। कक्षा Microsoft.SqlServer.Server.SqlContext)।

  2. एकाधिक असेंबली एक नामस्थान में योगदान दे सकती हैं।
    उदाहरण के लिए System.Data.dll असेंबली और System.Xml.dll असेंबली System.Xml नामस्थान में योगदान देती है।
    जिसका अर्थ है कि यदि आप अपनी परियोजना से System.Xml.XmlDataDocument कक्षा का उपयोग करते हैं, तो आपको System.Data.dll असेंबली का संदर्भ देना होगा।
    और यदि आप System.Xml.XmlDocument कक्षा का उपयोग करते हैं, तो आपको अपनी परियोजना से System.Xml.dll का संदर्भ देना होगा।

(उपर्युक्त उदाहरण .NET 4.0 हैं, लेकिन संभवतः पिछले .NET संस्करणों के लिए भी होल्डिंग हैं)।

Danny Thorpeexplainednamespace और internal की अवधारणा वास्तव में अच्छी तरह है, इसलिए मैं उन के बारे में विस्तार में जाने नहीं होंगे।

- जेरोइन

+1

+1: मेरे जैसे सी # के शुरुआती के लिए बहुत स्पष्ट स्पष्टीकरण – Guillaume07