2009-04-01 10 views
13

क्या निम्न कोड काम करेगा यदि संसाधन IDISposable लागू नहीं करता है?काम पर शून्य का उपयोग करेंगे?

T resource = new T(); 
    using (resource as IDisposable) 
    { 
    ... 
    } 
+1

का निपटान करता है लेकिन ... आप ऐसा क्यों करेंगे? –

+1

मुझे लगता है कि सवाल मान्य है और मुझे समझ में नहीं आता कि किसी ने इसे क्यों गिरा दिया। – alex

उत्तर

10

हाँ, यह, काम करेंगे यह चल रहा है परीक्षण की जाँच करें:

[TestMethod] 
public void TestMethod8() 
{ 
    using (new MyClass() as IDisposable) 
    { 
    } 
} 
public class MyClass { } 

यह सिर्फ किसी भी मुद्दे के बिना चलाता है। यदि संबंधित वर्ग IDISposable लागू करता है तो यह इसे कॉल करेगा, अगर नहीं, तो यह अभी भी काम करेगा/चलाएगा :)।

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

1

यदि "यह काम करेगा" तो आपका मतलब है कि आपको रनटाइम त्रुटि मिलेगी? नहीं, आप नहीं करेंगे।

1

इसका क्या उपयोग है? क्या फायदा है? क्या लाभ है?

उपयोग कथन यह सुनिश्चित करेगा कि निपटान विधि कहा जाता है, लेकिन यदि आपका ऑब्जेक्ट IDISposable लागू नहीं करता है, तो मुझे ऐसा करने का कोई उपयोग नहीं दिखाई देता है? यह काम करेगा (जैसा कि, यह रनटाइम अपवाद फेंक नहीं देगा और यह संकलित होगा), मैंने अभी इसका परीक्षण किया है लेकिन ...

आपके द्वारा लिखे गए कोड के साथ, आप यहां तक ​​कि संसाधन का उपयोग एक IDISposable के रूप में करें ...

+0

@ फ़्रेडरिक ने मेरे उत्तर में जोड़ा: मेरा अनुमान एक कारखाना है जो आपको विभिन्न कक्षाओं से उदाहरण प्राप्त कर सकता है जो डिस्पोजेबल हो सकता है या नहीं। – eglasius

0

मेरा मानना ​​है कि संकलक यह निर्धारित करने के लिए चेक जोड़ता है कि यह निपटान करने का प्रयास करने से पहले शून्य है या नहीं।

http://aspnetresources.com/blog/the_very_handy_using_statement.aspx

16

हां। using कथन जांचता है कि इसे null दिया जा रहा है और यदि ऐसा है तो Dispose पर कॉल करने का प्रयास करने से बचाता है।

सी # 3 कल्पना की धारा 8.13 से:

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

2

यह ठीक काम करना चाहिए, भले ही संसाधनों का निपटान करने के लिए "सही" दृष्टिकोण न हो। using बयान के लिए

IDisposable o = ...; 

try 
{ 
    // ... 
} 
finally 
{ 
    if (o != null) 
    o.Dispose(true); 
} 

तो बस वाक्यात्मक चीनी अगर ओ IDisposable लागू नहीं यह using बयान में अशक्त हो सकता है और यह उस पर Dispose फोन करने की कोशिश करेगा है।

+0

@ सैमुएल ने मेरे जवाब में जोड़ा: मेरा अनुमान एक कारखाना है जो आपको विभिन्न वर्गों से उदाहरण प्राप्त कर सकता है जो डिस्पोजेबल हो सकते हैं या नहीं। – eglasius

2

कोड का परीक्षण करने पर, ऐसा लगता है कि यह किसी भी संकलन या रन-टाइम त्रुटियों के परिणामस्वरूप नहीं होता है।

भाषा परिभाषा से (अनुभाग 8 देखें।13): -

एक अशक्त संसाधन हासिल कर ली है, तो कोई निपटान करने के लिए कॉल किया जाता है, और कोई अपवाद फेंक दिया है।

प्रकार IDisposible को ऑपरेटर संसाधन का अनुवाद शून्य पर होगा, और कोड ब्लॉक का उपयोग में समझाया के रूप में बिल्कुल ठीक निष्पादित करेंगे, ठीक ही व्यवहार कर परिवर्तनीय नहीं है, तो आप में यह संलग्न नहीं किया था के रूप में अगर ब्लॉक का उपयोग करना

संक्षेप में, आपके प्रश्न का उत्तर हाँ है।

1

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

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