2012-08-25 5 views
22

मेरे पास व्यापक स्थैतिक सदस्यों के साथ एक कक्षा है, जिनमें से कुछ प्रबंधित और अप्रबंधित वस्तुओं के संदर्भ रखती हैं।कैसे और कब सी # स्टेटिक सदस्यों का निपटारा किया जाता है?

उदाहरण के लिए, स्थिर कन्स्ट्रक्टर को टाइप के संदर्भ में जल्द ही बुलाया जाता है, जिससे मेरी कक्षा टास्क के ब्लॉकिंग को अवरुद्ध कर देती है। ऐसा तब होता है जब उदाहरण के लिए स्थिर विधियों में से एक कहा जाता है।

मैंने आईडीस्पोजेबल लागू किया, जो मुझे बनाए गए किसी भी इंस्टेंस ऑब्जेक्ट पर निपटान को संभालने के तरीकों को देता है। हालांकि, अगर उपभोक्ता मेरी कक्षा से कोई इंस्टेंस ऑब्जेक्ट नहीं बनाता है तो इन विधियों को कभी नहीं कहा जाता है।

मेरी कक्षा के स्थिर भाग द्वारा बनाए गए संदर्भों का निपटान करने के लिए मैं कोड कहां और कहां रखूं? मैंने हमेशा सोचा कि स्थिर-संदर्भित संसाधनों का निपटान तब हुआ जब आखिरी उदाहरण वस्तु जारी की गई; यह पहली बार है जब मैंने कभी एक कक्षा बनाई है जहां कोई भी उदाहरण कभी नहीं बनाया जा सकता है।

+1

स्टेटिक आइटम आवेदन की पूरी निष्पादन के लिए उपलब्ध हैं। आप नए कीवर्ड का उपयोग करके स्थिर आइटम नहीं बनाते हैं, इसलिए इसका मतलब है कि आपके पास कुछ भी नहीं हैं, क्योंकि आप वास्तव में कुछ भी तत्काल नहीं करते हैं। प्रबंधित वस्तुओं के बारे में, उनके बारे में चिंता न करें, जीसी उनकी देखभाल करेगा। अप्रबंधित संसाधनों के बारे में उन्हें एक गैर स्थैतिक वर्ग में उपयोग करने का प्रयास करें, या जब तक आप अपना आवेदन बंद नहीं कर लेते तब तक उन्हें रखा जाएगा। स्टेटिक आइटम निपटान का समर्थन नहीं करते हैं। – alexandrudicu

+0

धन्यवाद। ऐसा लगता है कि मुझे यहां अपने डिजाइन पर पुनर्विचार करने की आवश्यकता है। – Joe

उत्तर

35

आपकी कक्षा का स्थिर चर कचरा नहीं है जब तक कि आपकी कक्षा को होस्ट करने वाले ऐप डोमेन को अनलोड नहीं किया जाता है। Dispose() विधि नहीं कहा जाएगा, क्योंकि यह एक उदाहरण विधि है, और आपने कहा है कि आप अपनी कक्षा के किसी भी उदाहरण नहीं बनाएंगे।

यदि आप Dispose() विधि का उपयोग करना चाहते हैं, तो अपनी ऑब्जेक्ट को सिंगलटन बनाएं, इसका एक उदाहरण बनाएं, और स्पष्ट रूप से इसका निपटान करें जब आपका एप्लिकेशन बाहर निकलने वाला है।

public class MyClass : IDisposable { 
    public IList List1<int> {get; private set;} 
    public IDictionary<string,string> Dict1 {get; private set;} 
    public void Dispose() { 
     // Do something here 
    } 
    public static MyClass Instance {get; private set;} 
    static MyClass() { 
     Instance = new MyClass(); 
    } 
    public static void DisposeInstance() { 
     if (instance != null) { 
      Instance.Dispose(); 
      Instance = null; 
     } 
    } 
} 
+0

यह समझ में आता है। मुझे संदेह था कि मुझे अंततः सिंगलटन पटर का उपयोग करना होगा ... आपकी मदद के लिए धन्यवाद। – Joe

0

आपको इन वस्तुओं को मैन्युअल रूप से निपटाना चाहिए, स्थिर संसाधनों के लिए "अंतिमकरण" बनाने का कोई तरीका नहीं है।

+1

मैं मैन्युअल रूप से उनका निपटान कैसे करूं? मुझे कैसे सूचित किया जाएगा कि मुझे ऐसा करने की ज़रूरत है? – Joe

+0

@ जो यह तय करने के लिए पूरी तरह से आपके ऊपर है। केवल आप जानते हैं कि कॉल करने का समय कब होता है, जो स्थिर रूप से आयोजित की गई चीज़ का निपटान करता है। – vcsjones

+0

उदाहरण के लिए, मूल प्रश्न में उदाहरण देखें, जहां मैं क्रियाओं के अवरुद्ध होने के कारण स्पिन करता हूं। यह कतार तब तक चलनी चाहिए जब तक कि उपयोगकर्ता इसमें क्रियाओं को छोड़ना नहीं चाहता (स्थैतिक विधि के माध्यम से)। मुझे इसे और स्पष्ट करने दें; मैं उस कतार को निकालने वाले कार्य को कब मारूं? तो, मैं इसे कब मारूं? मुझे कैसे पता चलेगा कि मेरी कक्षा अब उपयोगकर्ता को "गुंजाइश" में नहीं है? – Joe

0
public class Logger : IDisposable 
{ 

    private string _logDirectory = null; 
    private static Logger _instance = null; 

    private Logger() : this(ConfigurationManager.AppSettings["LogDirectory"]) 
    { 
     AppDomain.CurrentDomain.ProcessExit += CurrentDomain_ProcessExit; 
    } 

    private Logger(string logDirectory) 
    { 
    } 

    public static Logger Instance 
    { 
     get 
     { 
      if (_instance == null) 
       _instance = new Logger(); 
      return _instance; 
     } 
    } 

    private void CurrentDomain_ProcessExit(object sender, EventArgs e) 
    { 
     Dispose(); 
    } 



    public void Dispose() 
    { 
     // Dispose unmanaged resources 
    } 
} 
संबंधित मुद्दे