2013-05-08 11 views
6

मैं इस क्षेत्र के साथ एक वर्ग है:मेरे आईडीस्पोजेबल ऑब्जेक्ट पर निपटान() विधि क्यों उपलब्ध नहीं है?

private WcfChannelFactory<IPrestoService> _channelFactory; 

Dispose() विधि में, मैं यह कर रहा हूँ:

if (_channelFactory != null) { _channelFactory.Dispose(); } 

लेकिन वह एक त्रुटि पैदा करता है:

Cannot access explicit implementation of IDisposable.Dispose

करने के बाद कुछ research, ऐसा लगता है कि मैं इस तरह से निपट सकता हूं:

if (_channelFactory != null) { (_channelFactory as IDisposable).Dispose(); } 

मैं दो बातें समझ में नहीं आता:

  1. क्यों उपलब्ध नहीं Dispose() है? WcfChannelFactory<T>ChannelFactory<T> से निकला है, जो ChannelFactory से निकला है, जो IDisposable लागू करता है। फिर भी ChannelFactory में Dispose() विधि नहीं है। यह कैसे संभव है?

  2. अगर मैं (? चाहिए) बस _channelFactory पर Close() कह सकते हैं, क्यों नहीं एक्सएमएल प्रलेखन राज्य कि Close() भी Dispose() फोन करेगा करता है? शायद यह नहीं होगा? यह भ्रामक है।

उत्तर

7
  1. रूप Dispose विधि IDisposable इंटरफेस के लिए स्पष्ट रूप कार्यान्वित किया जाता है, आप केवल विधि देख सकते हैं जब आप प्रकार IDisposable के एक संदर्भ है। विधि वहां है, लेकिन जब आप किसी भिन्न प्रकार का संदर्भ रखते हैं तो आप इसे नहीं देख सकते हैं। यह समान है कि कैसे एक निजी विधि केवल वर्ग के भीतर कोड से दिखाई देती है, हालांकि यह हमेशा वहां होती है।

  2. Close विधि इस कक्षा के लिए Dispose पर कॉल नहीं करेगी। विधि कारखाने को बंद नहीं करती है, यह एक एसिंक्रोनस समापन प्रक्रिया शुरू करता है। जब Close विधि निकलती है, तो समापन प्रक्रिया समाप्त नहीं होती है, इसलिए उस समय ऑब्जेक्ट का निपटारा नहीं किया जा सकता है।

+0

तो कैसे मैं '_channelFactory' के निपटान करना चाहिए? क्या मुझे 'बंद() 'कॉल करना है? क्या मुझे 'निपटान() 'कॉल करना है? –

+0

@ बॉब, कभी नहीं। अपने मूल प्रश्न को गलत समझें। ऐसा लगता है कि आप अपना खुद का डिस्पोजेबल पैटर्न लागू कर रहे हैं। –

+0

@ एंथनी पेगम मैं नहीं कर सकता। विधि '_channelFactory' लौटाती है। उपभोक्ता कॉल को 'उपयोग' में लपेट रहा है, इसलिए मेरी कक्षा को 'आईडीपोसेबल' और इसके डिप्लोस को लागू करने की आवश्यकता है। –

2

Dispose विधि इंटरफ़ेस IDisposable की एक स्पष्ट सदस्य के रूप में लागू किया गया था। जो है, परिभाषा कुछ इस तरह दिखता है:

public class WcfChannelFactory<T> : IDisposable 
{ 
    public void IDisposable.Dispose() 
    { 
     ... 
    } 
} 

ट्यूटोरियल: Explicit Interface Implementation Tutorial

+0

मुझे पता है कि स्पष्ट अंतरफलक कार्यान्वयन क्या है। धन्यवाद! –

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