2011-01-14 18 views
9

देखा। क्यों स्पष्ट रूप से स्पष्ट करने के लिए कास्ट? क्या यह सुनिश्चित करने के लिए सिर्फ एक शॉर्टेंड है कि उपयोग करने वाले ब्लॉक से बाहर निकलने पर आईडीस्पोजेबल को बुलाया जाता है?कास्ट टाइप IDISposable - क्यों?

using (proxy as IDisposable) 
{ 
    string s = proxy.Stuff()          
} 

उत्तर

25

यह "चाल", यदि आप इसे कॉल कर सकते हैं, तो proxy के कारण होने की संभावना है कि संकलक वास्तव में IDisposable लागू नहीं कर सकता है।

using निर्देश के बारे में अच्छी बात यह है, कि अगर यह करने के लिए पैरामीटर null है, तो Dispose करने के लिए कोई कॉल using बयान के दायरे से बाहर निकलने पर किया जाएगा है।

तो कोड आप दिखाया है वास्तव में कम हाथ के लिए है:

var disposable = proxy as IDisposable; 
try 
{ 
    string s = proxy.Stuff(); 
} 
finally 
{ 
    if (disposable != null) 
     disposable.Dispose(); 
} 

दूसरे शब्दों में, यह कहते हैं, "इस वस्तु को लागू करता है, तो IDisposable, मैं इसे के निपटान के लिए जब मैं पूरा कर लेने की जरूरत है कोड का निम्नलिखित टुकड़ा। "

+0

+1 "यदि यह ऑब्जेक्ट IDISposable लागू करता है ..." – Justin

4

यह अनावश्यक रूप using बयान स्पष्ट रूप IDisposable इंटरफ़ेस से जुड़ा हुआ है है, per the MSDN docs

एक सुविधाजनक वाक्य रचना कि IDisposable वस्तुओं के सही उपयोग सुनिश्चित करता है प्रदान करता है।

संपादित:

रूप

using (ResourceType resource = expression) statement 
का विवरण का उपयोग कर: C# language spec (। सेकंड 8.13) using बयान के वाक्यात्मक चीनी के लिए तीन संभावित विस्तार प्रदान करता है

तीन संभावित विस्तारों में से एक के अनुरूप है। जब ResourceType गैर-व्यर्थ मान प्रकार है, विस्तार, अन्यथा

{ 
    ResourceType resource = expression; 
    try { 
     statement; 
    } 
    finally { 
     ((IDisposable)resource).Dispose(); 
    } 
} 

है जब ResourceType एक नल मान प्रकार या एक संदर्भ गतिशील के अलावा अन्य प्रकार है, विस्तार

{ 
    ResourceType resource = expression; 
    try { 
     statement; 
    } 
    finally { 
     if (resource != null) ((IDisposable)resource).Dispose(); 
    } 
} 
है

अन्यथा, जब ResourceType गतिशील है, विस्तार

है
{ 
    ResourceType resource = expression; 
    IDisposable d = (IDisposable)resource; 
    try { 
     statement; 
    } 
    finally { 
     if (d != null) d.Dispose(); 
    } 
} 

ध्यान दें कि इन विस्तारों में से प्रत्येक में कास्ट वैसे भी किया जाता है, इसलिए मूल रूप से कहा गया है, as IDisposable अनावश्यक है।

+2

क्या होगा यदि "प्रॉक्सी" एक ऑब्जेक्ट है जो प्रोग्रामर "जानता है" लागू करता है IDISposable, लेकिन संकलक इसे सत्यापित नहीं कर सकता है? तब कास्ट क्यों जरूरी नहीं होगा? –

+0

हाँ, अगर कोई कारण नहीं है अपने पाठक है कि 'proxy' IDisposable – Will

+0

जब तक उसकी प्रॉक्सी एक WCF प्रॉक्सी, जिस स्थिति में यह एक का उपयोग कर ब्लॉक का उपयोग करने के लिए सुरक्षित नहीं है नहीं है फैली करने के लिए स्पष्ट होना। लेकिन यह एक और विषय है। –

3

यदि आपको कहीं से proxy उदाहरण दिया गया है तो इसकी आवश्यकता हो सकती है और इसका स्थिर प्रकार IDisposable लागू नहीं करता है लेकिन आप जानते हैं कि असली प्रकार कर सकता है और आप यह सुनिश्चित करना चाहते हैं कि इसे डिस्पोजेड किया जाएगा।

public class Proxy : ISomeInterface, IDisposable 
{ 
    ... 
} 

private ISomeInterface Create() { ... } 

ISomeInterface proxy = Create(); 

//won't compile without `as` 
using(proxy as IDisposable) 
{ 
    ... 
} 
+0

+1 आप जेनिक्स के साथ एक समान उदाहरण भी प्राप्त कर सकते हैं। –

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