c# - तुरंत बंद किए बिना किसी नए रूप को निपटाने का उचित तरीका क्या है?




winforms (3)

इसलिए मेरी क्षुधा में, मैं मक्खी पर प्रपत्रों के नए उदाहरण बनाना चाहता हूं, फिर उन्हें प्रदर्शित करने के लिए फ़ॉर्म (।) का उपयोग करें (गैर मामूली)।

private void test_click(object sender, EventArgs e)
{
    var form = new myForm();
    form.Show();
}

हालांकि, कोड क्रैकर मुझे बताता है कि इन रूपों का निपटान किया जाना चाहिए। इसलिए, मैंने उन्हें "उपयोग" कथन के साथ लपेटा, लेकिन फिर वे खोलने के तुरंत बाद बंद हो गए।

using (var form = new myForm())
{
    form.Show();
}

मैं Form.ShowDialog () का उपयोग नहीं करना चाहता, क्योंकि कुछ उदाहरणों में मैं नई खिड़कियां खोल रहा हूं जो केवल रिपोर्ट दिखाती हैं; मुझे उन्हें मोडल होने की आवश्यकता नहीं है।


आप प्रपत्र प्रबंधक के कुछ प्रकार को कार्यान्वित कर सकते हैं जो OnFormClosedEvent सदस्यता OnFormClosedEvent प्रत्येक फ़ॉर्म के लिए यह दिखाता है, यह तब उन्हें निपटान कर सकता है ... कुछ इस तरह:

public class FormManager
{
    public T ShowForm<T>()
        where T : Form, new()
    {
        var t = new T();
        t.OnFormClosing += DisposeForm;
        return t;
    }

    void DisposeForm(object sender, FormClosedEventArgs args)
    {
        ((Form)sender).Dispose();
    }
}

जब तक प्रबंधक डिस्पोज़ नहीं किया जाता है, तब तक आप IDisposable को लागू IDisposable और सभी गैर-निपटान किए गए फ़ॉर्मों को निपटाने के लिए जा सकते हैं :)


इसलिए thread पर जवाब के अनुसार, जब भी आप उन्हें बंद करते हैं, तो गैर-मोडल फ़ॉर्म स्वचालित रूप से डिस्पोज़ हो जाते हैं।

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


क्या फॉर्म बंद होने के बाद मुझे फॉर्म को डिस्पोज करना होगा?

जब आप कोई Form बंद करते हैं, तो एक WM_CLOSE संदेश विंडो में भेजा जाएगा। यदि आप WmClose विधि के स्रोत कोड पर एक नज़र WmClose जो WM_CLOSE संदेश को संभालता है, तो आप देखेंगे:

  • मोडल रूपों के लिए (जो आपने ShowDialog का उपयोग करके दिखाया था), Dispose विधि को नहीं कहा जाएगा और फॉर्म बंद होने के बाद मौजूद है और आप कुछ डेटा प्राप्त करने के लिए इसके गुणों का उपयोग कर सकते हैं या आप इसे फिर से दिखा सकते हैं।

  • गैर-मोडल रूपों के लिए (जो आपने Show का उपयोग करके दिखाया था), फॉर्म बंद होने के बाद, Dispose विधि को बुलाया जाएगा।

तो यहाँ निष्कर्ष है:

  • जब आप शो विधि का उपयोग करके एक फॉर्म दिखाते हैं, तो आपको Dispose आवश्यकता नहीं होती है (और आप नहीं कर सकते हैं)। फॉर्म बंद होने के बाद खुद ही निपट जाएगा।

  • जब आप ShowDialog का उपयोग करके एक फ़ॉर्म दिखाते हैं, तो आपको मैन्युअल रूप से Dispose को कॉल करना होगा। एक अच्छा अभ्यास एक using ब्लॉक में मोडल रूपों का using है।







winforms