2012-04-03 37 views
6

मैं स्कोप प्रबंधन के लिए पूरी तरह से using कथन का उपयोग करना चाहता हूं। क्या मैं अंतर्निहित ऑब्जेक्ट का एक स्पष्ट संदर्भ धारण कर सकता हूं जो IDisposable लागू करता है?क्या मैं आरएचवी (दाएं हाथ मूल्य) के साथ कथन का उपयोग कर उपयोग कर सकता हूं?

उदाहरण के लिए

, इस declaraions दे रही है:

class ITransactionScope : IDisposable {} 
class TransactionGuard : ITransactionScope {...} 

class DbContext 
{ 
    public IDisposable ITransactionScope() 
    { 
     return new TransactionGuard(); 
    } 
} 

मैं कर सकता हूँ निम्नलिखित:

void main() 
{ 
    var dbContext = new DbContext(); 

    using (dbContext.TransactionScope()) 
    { 
     // the guard is not accessed here 
    } 
} 

using बयान के दौरान TransactionGuard उदाहरण जिंदा है?

+0

आप इसे आजमा सकते हैं। लौटे हुए दायरे के उदाहरण की 'निपटान()' विधि में ब्रेक पॉइंट सेट करें और देखें कि क्या इसे कॉल किया जाता है या नहीं। – linuxuser27

+0

मुझे उम्मीद है कि आप ऐसा कर सकते हैं क्योंकि मैं एक ही रणनीति का उपयोग करता हूं और यह काम करता है :) –

+3

यदि आप सभी के बारे में परवाह है तो स्कोप प्रबंधन है, क्या आप कोड में ब्रेसिज़ नहीं डाल सकते (बिना 'उपयोग' के) और यह स्पष्ट होगा अंदर कोड के लिए दायरा? –

उत्तर

10

मैं स्कोप प्रबंधन के लिए पूरी तरह से using कथन का उपयोग करना चाहता हूं।

आपको using कथन का उपयोग इसके लिए डिज़ाइन किया गया है: समय-समय पर एक अप्रबंधित संसाधन का निपटान करना चाहिए। यदि ऐसा नहीं है कि आप using का उपयोग कर रहे हैं, तो आप शायद कुछ गलत कर रहे हैं।

क्या मैं IDisposable लागू करने वाली अंतर्निहित वस्तु के लिए एक स्पष्ट संदर्भ धारण कर सकता हूं?

जैसा कि एक और उत्तर ने बताया: आप पहले ही कोड टाइप कर चुके हैं; आप बस कोशिश कर सकते थे।

हाँ, आप यह कर सकते हैं। कंपाइलर आपके लिए एक अदृश्य स्थानीय चर बना देगा और उस पर Dispose पर कॉल करेगा।

मैं अनुशंसा करता हूं कि यदि आपके पास using के उपयोग के बारे में और प्रश्न हैं जो आपने सी # 4 विनिर्देश के खंड 8.13 को पढ़ा है।

+0

क्या आप कृपया मेरे उत्तर देख सकते हैं? जीसी इसे पुनः प्राप्त नहीं करेगा? – Aliostad

+0

@Aliostad: सी # विनिर्देश बताता है कि '(expr) s का उपयोग करना; '' tem temp = expr के बराबर है; कोशिश करो } अंत में {अगर (temp! = null) ((IDISposable) temp)।();} '। क्या आपका दावा है कि कचरा कलेक्टर 'निपटान' करने के लिए कॉल * से पहले * अस्थायी साफ करेगा? –

+0

@Eric शायद आप सी # सुविधाओं का दुरुपयोग करने के बारे में एमवीसी टीम से बात कर सकते हैं। ;) हालांकि मुझे यह बुरा नहीं लगता; यह एक आसान वाक्यविन्यास है, और यह प्रतिबिंब का उपयोग नहीं करता है। –

2

यह तब तक जीवित है जब तक आप इसका निपटान नहीं करते। तो हाँ।

और इस प्रकार का प्रश्न आपके लिए संकलन और रन बटन को मारकर जवाब देने के लिए इतना आसान है। आपने कोड को पहले ही टाइप किया है। कोशिश करो।

+1

-1। आवश्यक रूप से यह सही नहीं है। आप कोशिश कर सकते हैं और यह 100 बार काम करता है लेकिन आखिरी बार नहीं। – Aliostad

+5

@Aliostad: मैं आपका अनुसरण नहीं कर रहा हूं। आलोचना पूरी तरह से जरूरी है; दस्तावेज़ को आसानी से कोशिश कर रहा था, या यहां तक ​​कि बेहतर, दस्तावेज़ को पढ़कर और फिर कोशिश कर रहा था। क्या आप मुझे ऐसे प्रोग्राम का उदाहरण दे सकते हैं जहां एक कथन का विवरण पंक्ति में सौ बार काम करता है और फिर विफल रहता है? –

+0

@EricLippert मेरा मुद्दा यह था कि जीसी 'स्टेटमेंट' का उपयोग करने से पहले इसे पुनः प्राप्त कर सकता है। इसलिए मेरा जवाब, यदि आप इसकी समीक्षा कर सकते हैं तो आभारी होंगे। – Aliostad

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