ट्रैक
/
C#
C#
/
सिलेबस
/
संसाधन सफाई
सं

संसाधन सफाई में C#

2 अभ्यास

संसाधन सफाई के बारे में

संसाधनों की सफाई में IDisposable इंटरफेस का केंद्रीय स्थान है और C# में इसकी दो महत्वपूर्ण भूमिकाएँ हैं:

  • यह इंटरफेस लागू करने वाली क्लास का इस्तेमाल करने वालों को बताता है कि उन्हें क्लास को बता देना है कि अब उसकी ज़रूरत नहीं रही। इसके लिए वे Dispose() मेथड कॉल करते हैं। इससे क्लास अपने अप्रबंधित संसाधन मुक्त कर सकती है या अपनी आंतरिक स्थिति को ज़रूरत के मुताबिक फिर से व्यवस्थित कर सकती है। सफाई का सामान्य तरीका इससे अलग है, जिसमें गार्बेज कलेक्टर को सब कुछ साफ करने दिया जाता है (मुख्य रूप से मेमोरी मुक्त करने दिया जाता है)।
  • कंपाइलर और रनटाइम के साथ मिलकर IDisposable इंटरफेस using स्टेटमेंट की सुविधा देता है। इस स्टेटमेंट की चर्चा resource-lifetime अभ्यास में की गई है।

यह संभव है, पर होने की गुंजाइश कम है कि किसी जेनेरिक सफाई रूटीन में Dispose() को इंटरफेस के ज़रिए कॉल किया जाए।

IDisposable का सामना सबसे अधिक ऐसी लाइब्रेरी क्लासों के साथ होता है जो ऑपरेटिंग सिस्टम के (अप्रबंधित) संसाधनों को लपेटती हैं, जैसे System.IO.Stream और System.IO.TextReader। (दूसरे अभ्यासों में Stream और TextReader को भी समझाया गया है।)

public class TextHandler : IDispoable
{
    private TextReader reader = new TextReader(...);

    public void Dispose()
    {
        reader.Dispose();
    }
}

अगर आप जिस क्लास का इस्तेमाल कर रहे हैं वह IDispoable इंटरफेस को लागू करती है, तो आपको यह पक्का करना होगा कि इंस्टेंस की ज़रूरत न रहने पर Dispose() कॉल हो जाए (catch और finally क्लॉज़ के ज़रिए)। अगर किसी क्लास में कोई मेंबर IDisposable को लागू करता है, तो बहुत संभव है कि उस क्लास को खुद भी IDisposable लागू करना पड़े, ताकि उस मेंबर को मुक्त करने के लिए, जो IDisposble को लागू करता है, Dispose() कॉल किया जा सके।

public class Activity : IDisposable
{
    private MyResource myResource;

    public Activity()
    {
        myResource = new MyResource();
    }

    public void Perform()
    {
        try
        {
            myResource.BeUseful();
        }
        catch (Exception)
        {
            myResource.Dispose();
        }
    }

    public void Dispose()
    {
        myResource.Dispose();
    }
}

IDisposable इंटरफेस तब भी काम आ सकता है जब कहीं कोई अप्रबंधित संसाधन शामिल ही न हो। मान लीजिए आपके पास एक लंबे समय तक रहने वाला ऑब्जेक्ट है, जिसके लिए यह ज़रूरी है कि कम समय तक रहने वाले ऑब्जेक्ट उसमें खुद को पंजीकृत करें और ज़रूरत न रहने पर खुद को हटा दें। कम समय तक रहने वाले ऑब्जेक्ट पर IDisposable लागू करने से उस क्लास का इस्तेमाल करने वाले डेवलपर को यह पता चल जाता है कि उस ऑब्जेक्ट के जीवन के अंत में Dispose() कॉल करना ज़रूरी है।

डिस्पोज़ पैटर्न

डॉक्युमेंटेशन में आपको डिस्पोज़ पैटर्न के संदर्भ मिलेंगे। डिस्पोज़ पैटर्न में यह शामिल है कि क्लास के फाइनलाइज़र से Dispose() को कॉल किया जाए और यह पक्का किया जाए कि बेस क्लासों में संसाधनों को मुक्त करना ठीक से संभाला गया हो। डिस्पोज़ पैटर्न पर आगे के किसी अभ्यास में बात की गई है।

डिस्पोज़ पैटर्न का संबंध मुख्य रूप से अप्रबंधित संसाधनों से है। अगर आप P/Inovke तंत्र और extern मेथड इस्तेमाल कर रहे हैं, तो आपको यह समझना होगा कि डिस्पोज़ पैटर्न कैसे और कब लागू करना है। अधिकांश C# डेवलपर को इस तरह सीधे अप्रबंधित संसाधनों से निपटना शायद ही कभी पड़ता है।

GitHub के ज़रिए संपादित करें यह लिंक नई विंडो या टैब में खुलता है।

संसाधन सफाई सीखिए

अभ्यास लॉक है

संसाधन सफाई पर अभ्यास करने के लिए 1 और अभ्यास अनलॉक कीजिए