क्या C # 8 में एक गैर-अशक्त संदर्भ प्रकार रनटाइम में शून्य हो सकता है?


10

यह मुझे लगता है कि वास्तव में कोई गारंटी नहीं है कि एक गैर-अशक्त चर कभी भी अशक्त नहीं होगा। कल्पना कीजिए कि मेरे पास एक वर्ग है जिसमें एक संपत्ति है जो अशक्त नहीं है:

public class Foo
{
    public Foo(string test)
    {
        Test = test;
    }
    public string Test {get;set;}
}

अब ऐसा लग सकता है कि यह अब शून्य नहीं हो सकता। लेकिन अगर हम इस वर्ग को किसी अन्य पुस्तकालय के साथ संदर्भित करते हैं जो अशक्त संदर्भ का उपयोग नहीं करता है, तो कुछ भी इसे अशक्त भेजने से नहीं रोकता है।

क्या यह सही है या कुछ रनटाइम चेक भी हैं जो शायद यह सुनिश्चित करते हैं?


यह है public void Foo(string test){...}या public Foo(string test){...}?
huMpty duMpty

धन्यवाद, मैंने इसे ठीक कर लिया है। ऐसा तब होता है जब निर्माणकर्ता उत्पन्न करने के लिए मनुष्य R # पर बहुत अधिक निर्भर करता है :)
Ilya Chernomordik

2
C # 9 विल (संभावना) सरलीकृत शून्य सत्यापन जोड़ देगा ।
स्टीवन

संक्षेप में, "अशक्त संदर्भ प्रकार" सुविधा पूरी तरह से टूट गई है।
एलेजांद्रो

जवाबों:


9

यह वही है जो एमएस ( https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/upgrad-to-nullable-references#interfaces-with-external-code ) के बारे में कहता है :

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


2

कोई हमेशा कर सकता है

var myFoo = new Foo(null);

हो सकता है कि आप डोमेन ड्रिवेन डिज़ाइन का उपयोग कर सकते हैं

public class Foo
{
    public Foo(string test)
    {
         if (string.IsNullOrWhiteSpace(test))
             throw new ArgumentNullException(nameof(test));

         Test = test;
    }
    public string Test {get;private set;}
}

हाँ, आप सही हैं, यह सिर्फ एक चेतावनी है, वैसे भी मुझे लगता है। मुझे आशा है कि भविष्य में वे इसे किसी तरह लागू कर सकते हैं जैसे कोटलिन
इल्या चेर्नोमोर्डिक

2

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

यदि आप एक रनटाइम जांच चाहते हैं तो आप हमेशा इसे स्वयं कर सकते हैं:

public string Test { get; set{ if (value == null) throw new ArgumentNullException() } }

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

बेशक लोग अभी भी प्रतिबिंब का उपयोग कर सकते हैं च *** अपने कोड अप, लेकिन फिर उन पर


तो इसका प्रभावी अर्थ है कि मैं अभी भी अशक्त संदर्भ अपवाद प्राप्त कर सकता हूं, भले ही मैं गैर-अशक्त प्रकार का उपयोग करूं, सही?
इल्या चेर्नोमोर्डिक 12

ठीक है .... आप जिस कोड को संकलित नहीं कर सकते हैं, उस पर आपके संकेत हैं ... लेकिन अन्य लोगों के कोड जिनके पास संकेत नहीं हैं, लेकिन आपके कोड का संदर्भ दें - हां वे एक शून्य अपवाद प्राप्त कर सकते हैं
मिल्नी 12

ठीक है, अगर उदाहरण के लिए एक ऑटोमेपर आपके कंस्ट्रक्टर का उपयोग करता है, या ऐसा कुछ, यह अभी भी है जो आपको अपवाद मिलेगा :)
इल्या चेर्नोमोर्डिक

Of course people can still use reflection to f*** your code up, सच, सच। आप निश्चित रूप से ऐसा करने के लिए प्रतिबिंब का उपयोग कर सकते हैं, क्या यह अनुशंसित है , नहीं , क्या लोग अभी भी इसे करते हैं, हाँ।
13:ö24xěŕ

2

यहां तक ​​कि अपने स्वयं के कोड में, यदि आप ऐसा करना चुनते हैं, तो आप nullअशक्त-क्षमाशील ऑपरेटर का उपयोग करके पास कर सकते हैं । null!संकलक की अशक्तता विश्लेषण का संबंध है, अब तक नहीं-शून्य माना जाता है।


-1

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

यहाँ और अधिक पढ़ने:

https://www.c-sharpcorner.com/article/null-object-design-pattern/

मूल रूप से, इसमें एक नया ऑब्जेक्ट बनाना शामिल है जो एक ही इंटरफ़ेस से लिया गया है और इसमें शून्य उदाहरण है।

उदाहरण:

public class NullExample : IExample  
{  
    private static NullExample _instance;  
    private NullExample()  
    { }  

    public static NullExample Instance  
    {  
        get {  
            if (_instance == null)  
                return new NullExample();  
            return _instance;  
        }  
    }  

    //do nothing methods  
    public void MethodImplementedByInterface1()  
    { }  

    public void MethodImplementedByInterface1()  
    { }  
}  

नल कैंट से बचा जा सकता है, हालांकि उन्हें साफ तरीके से जांचा जा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.