क्या अशक्त वस्तु के साथ डिस्पोजल () का उपयोग किया जाएगा?


179

क्या using(संभावित) अशक्त वस्तु पर कथन का उपयोग करना सुरक्षित है ?
निम्नलिखित उदाहरण पर विचार करें:

class Test {
    IDisposable GetObject(string name) {
        // returns null if not found
    }

    void DoSomething() {
        using (IDisposable x = GetObject("invalid name")) {
            if (x != null) {
                 // etc...
            }
        }
    }
}

क्या यह गारंटी है कि Disposeवस्तु को अशक्त नहीं होने पर ही बुलाया जाएगा, और मुझे नहीं मिलेगा NullReferenceException?


जवाबों:


172

हां, Dispose()केवल गैर-अशक्त वस्तुओं पर कहा जाता है:

http://msdn.microsoft.com/en-us/library/yh598w02.aspx


30
ध्यान दें कि यदि आपका चर शून्य है, तो भी ब्लॉक का उपयोग किया जाता है, और यदि आप पहले ब्लॉक का उपयोग करके अपने वेरिएबल को बिना किसी शून्य-जाँच के संदर्भित करते हैं, तो आपको NullReferenceException मिल जाएगी। गलत व्याख्या को रोकने के लिए, इस उत्तर में बताया जाना चाहिए: "हां, Dispose()केवल गैर-अशक्त वस्तुओं पर कहा जाता है"।
9

37

यह जांचने के लिए usingकि वस्तु उस पर nullकॉल Disposeकरने से पहले नहीं है, हां, यह सुरक्षित है।

आपके मामले में आपको कुछ ऐसा मिलेगा:

IDisposable x = GetObject("invalid name");
try
{
    // etc...
}
finally
{
    if(x != null)
    {
        x.Dispose();
    }
}

14

आपको इसके साथ ठीक होना चाहिए:

using ((IDisposable)null) { }

यहां कोई अपवाद नहीं फेंका गया।

साइड नोट: इस के साथ गलती मत करो foreachऔर IEnumerableजहां एक अपवाद फेंक दिया जाएगा।


1

हां, संदर्भ को निपटाने से पहले अशक्त हो जाएगा। आप रिफ्लेक्टर में अपना कोड देखकर अपनी जांच कर सकते हैं।


-3

मेरे अनुभव के अनुसार आपको अशक्त संदर्भ अपवाद नहीं मिलेगा। इसे बस नजरअंदाज किया जाएगा।

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