सवाल क्या सी # 4 नेमस्पेस को इस तरीके से अनुकूलित करता है कि पिछले सी # संस्करण नहीं थे?


यह सवाल ब्याज के लिए है। मैं एक थर्ड पार्टी लाइब्रेरी के साथ काम कर रहा हूं और निम्नलिखित दस्तावेज में आया हूं CMS.Security.Dummy वर्ग:

इस वर्ग को न हटाएं - यह वर्ग कंपाइलर से रोकता है   .NET 4.0 के तहत संपूर्ण नामस्थान छोड़ना।

क्या कोई जानता है, या कोई अनुमान लगा सकता है कि डमी वर्ग को हटा दिए जाने पर .NET 4 नामस्थान छोड़ देगा क्यों?

चूंकि .NET 4 को स्रोत कोड टिप्पणी में स्पष्ट रूप से नामित किया गया है, मुझे लगता है कि पिछले सी # संस्करण प्रदर्शन व्यवहार को प्रदर्शित करते हैं जिसके लिए इस डमी क्लास की आवश्यकता नहीं होती है। हालांकि यह पूरी तरह से सट्टा है।

स्क्रीन शॉट

documentation

Decompiled स्रोत कोड 

#region Assembly CMS.SettingsProvider.dll, v4.0.30319
// ...\solution\wwwroot\Bin\CMS.SettingsProvider.dll
#endregion

using System;

namespace CMS.Security
{
    // Summary:
    //     DO NOT DELETE THIS CLASS - This class prevents the compiler from dropping
    //     entire namespace under .NET 4.0.
    public class Dummy
    {
        // Summary:
        //     DO NOT DELETE THIS CLASS - This class prevents the compiler from dropping
        //     entire namespace under .NET 4.0.
        public Dummy();
    }
}

44
2018-03-05 21:40


मूल


यह देखना दिलचस्प होगा कि लाइब्रेरी के प्री-एनईटी 4.0 संस्करण में ऐसा कुछ है या नहीं। - AakashM
आईआईआरसी नामस्थान अलग-अलग इकाइयों के रूप में सीआईएल में मौजूद नहीं हैं - वे बस योग्य प्रकार के नामों का हिस्सा बन जाते हैं। (AFAIK जो सीएलआई के सभी संस्करणों के लिए सच है और .NET 4 के लिए विशिष्ट नहीं है) इस अर्थ में मैं @ जोन स्कीट के उत्तर का समर्थन करूंगा। - stakx
एक संदिग्ध आवश्यकता द्वारा उठाया गया एक अच्छा सवाल :) - Johann Blais
अब यह जानना दिलचस्प होगा कि पुस्तकालय (इसे सोचता है) नामस्थान की आवश्यकता क्यों है ... - Konrad Rudolph
संभावना है कि तृतीय पक्ष स्रोत ने ऐसे नामों का उपयोग किया है जो इस नामस्थान का संदर्भ लेते हैं। यह हैक संभवतः वहां है कि उन्हें अपने स्रोत को अपडेट करने की आवश्यकता नहीं है, या कम संभावना है, उन ग्राहकों के साथ पिछड़ा संगतता बनाए रखें जिनके पास उस नामस्थान पर निर्भरता भी है। - bryanbcook


जवाब:


एक छोटी सराहनीय तथ्य यह है कि अंतर्निहित सीएलआर प्रकार प्रणाली के दृष्टिकोण से "नेमस्पेस" जैसी कोई चीज़ नहीं है। इसके बजाय, यह सिर्फ एक है सम्मेलन कि हम कहते हैं कि एक प्रकार जिसमें उसके नाम की अवधि शामिल है "नामस्थान का सदस्य" है। तर्क में कानूनी कोड के बीच बिल्कुल कोई अंतर नहीं है:

namespace N
{
    class C  {}
}

और psuedo-code:

class N.C {}

सी # आपको इस सुखद कथा का नाटक करने के लिए मजबूर करता है वास्तविकता है, लेकिन यह सिर्फ एक कथा है - सीएलआर प्रकार प्रणाली के परिप्रेक्ष्य से, बेशक। सी # कंपाइलर के परिप्रेक्ष्य से, निश्चित रूप से नामस्थान "असली" हैं। वे सिर्फ एक प्रकार के नाम के अलावा मेटाडाटा में किसी भी चीज़ के अनुरूप नहीं हैं।

संक्षेप में: यदि आप एक "खाली" नामस्थान के साथ असेंबली करते हैं तो संकलित बाइनरी में "नेमस्पेस" मौजूद नहीं है। एक "नेमस्पेस" केवल अस्तित्व में आता है जब लाइब्रेरी में एक प्रकार होता है जिसमें उसके नाम होते हैं।

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

मुझे लगता है कि पिछले सी # संस्करण प्रदर्शन व्यवहार करते हैं जिन्हें इस डमी क्लास की आवश्यकता नहीं होती है

नहीं। 1.0 से सी # के प्रत्येक संस्करण खाली नामस्थान फेंकता है।


90
2018-03-05 22:22



महान उत्तर / स्पष्टीकरण! - Joseph at SwiftOtter
मैं मानता हूं कि रिक्त नामस्थान होने के बारे में उनकी परवाह है क्योंकि वे इसे कहीं और कथन का उपयोग करने में संदर्भित करते हैं। यदि नामस्थान अस्तित्व में नहीं था, तो कथन का उपयोग एक संकलन-समय त्रुटि होगी। क्यों उपयोग बयान को हटा नहीं है? यह कुछ कोड जनरेशन टूल का आउटपुट हो सकता है जिन पर उनका कोई नियंत्रण नहीं है। (कम से कम, यह वह स्थिति है जहां मुझे इससे पहले सामना करना पड़ा था।) - Tadmas


यह देखते हुए कि नामस्थान में कोई भी सदस्य नहीं है (उस वर्ग के बिना), मुझे यकीन नहीं है कि यहां तक ​​कि भी है संकल्पना उस बिंदु पर एक नामस्थान का ... और न ही मैं इसे किसी भी तरह से उपयोगी होने की उम्मीद करता हूं।

मैंने इसे सी # 2 कंपाइलर के साथ पुन: उत्पन्न करने की कोशिश की है, और मैं आईएल के भीतर खाली नामस्थान का कोई निशान नहीं देख सकता।


23
2018-03-05 21:45





एकमात्र अर्ध-संबंधित मुद्दा मैं सोच सकता हूं कि एमएसबिल्ड में एक परियोजना को संकलित करते समय, अप्रत्यक्ष संदर्भ हमेशा मौजूदा ऐप की बिन निर्देशिका में प्रतिलिपि नहीं होते हैं। यदि लाइब्रेरी बी अप्रत्यक्ष रूप से लाइब्रेरी ए और लाइब्रेरी सी संदर्भ बी संदर्भित करता है, लाइब्रेरी ए का आउटपुट आवश्यक रूप से लाइब्रेरी सी को संकलित करते समय बिन फ़ोल्डर में कॉपी नहीं किया जाएगा। अतीत में, मैंने कक्षा में एक शून्य फ़ील्ड संदर्भ का उपयोग किया है ताकि यह सुनिश्चित किया जा सके कि निर्भरता स्पष्ट है और आउटपुट ठीक से तैनात किया गया है। शायद मूल देवताओं ने कुछ समान अनुभव किया और यह उनका समाधान था?


7
2018-03-05 21:50



आप इसके लिए तर्क के बारे में सही हो सकते हैं, जिसमें नामस्थान को किसी उद्देश्य के लिए देखा जाने की उम्मीद है: शायद एक उपकरण या किसी परीक्षण में कुछ अस्पष्ट किनारे के मामले से। कौन जाने। मेरी इच्छा है कि प्रलेखन ने कहा कि नामस्थान केवल इसके लिए क्यों मौजूद होना चाहिए। - John K