2008-11-01 12 views
36

कुछ स्थैतिक समापन करने का सही तरीका क्या है?स्टेटिक फ़ाइनलाइज़र

कोई स्थैतिक विनाशक नहीं है। AppDomain.DomainUnload ईवेंट डिफ़ॉल्ट डोमेन में नहीं उठाया गया है। AppDomain.ProcessExit ईवेंट सभी ईवेंट हैंडलरों के बीच तीन सेकंड (डिफ़ॉल्ट सेटिंग्स) का कुल समय साझा करता है, इसलिए यह वास्तव में उपयोग करने योग्य नहीं है।

+2

पहले, सी # में, हम दूसरे शब्दों में finalizer और नाशक का उपयोग कर की आदत से बाहर निकलने की जरूरत है। एक निर्धारक है, दूसरा नहीं है। यह ध्यान रखना दिलचस्प है कि सी # स्पेक सीएलआर और अन्य .NET भाषा चश्मे से पिछड़े शब्दों को प्राप्त करता है।यह भी दिलचस्प है कि सी # भाषा समिति के नोट स्पष्ट रूप से कहते हैं कि सी # में स्थिर फाइनल नहीं होने के कारण कोई पूर्व कारण नहीं हैं। http://stackoverflow.com/a/1875149/56793 – JMD

उत्तर

27

असल में, आप नहीं कर सकते। पूरी तरह से संभव है कि इसके चारों ओर अपने रास्ते डिजाइन करें।

भूल जाते हैं कि एक कार्यक्रम हमेशा अचानक वैसे भी समाप्त कर सकते हैं न करें - किसी को सत्ता स्पष्ट उदाहरण है बाहर खींच रहा है। तो आपको जो कुछ भी करना है वह "सर्वश्रेष्ठ प्रयास" होना चाहिए - इस मामले में मैं निश्चित रूप से आशा करता हूं कि AppDomain.ProcessExit पर्याप्त होगा।

क्या आप अपने विशेष मामले में क्या करना चाहिए?

+1

यह उत्तर माइकल द्वारा उत्तर से कैसे संबंधित है (क्योंकि ऐसा लगता है कि स्थिर अंतिमकर्ता होना संभव है)? (किसी भी तरह से मैं सहमत हूं कि अंतिमकर्ता अविश्वसनीय हैं।) – mafu

+0

@ माफ्रुट: माइकल का जवाब वास्तव में एक स्थिर अंतिमकरण नहीं है। यह एक स्थिर क्षेत्र है जिसमें एक उदाहरण के संदर्भ में एक फाइनलाइज़र है। यह वही बात नहीं है, भले ही इसका समान प्रभाव हो। मैं इसे व्यक्तिगत रूप से उपयोग नहीं करता। –

+0

वास्तव में, आप पूरी तरह से सही हैं। व्याख्या करने के लिए धन्यवाद! – mafu

6

मैं सवाल होता है कि आप अपने स्थिर तरीकों जारी होने की जरूरत है कि में लोड कर रहे हैं। मैं निश्चित रूप से एक स्थिर विधि में इन चीजों को करने की सिफारिश नहीं करता।

कहा कि, अपने स्थिर विधि एक वस्तु एक को अंतिम रूप देने विधि है कि instanciate सकता है।

6

दो समाधान है कि मन के लिए कूद:

  • एक स्थिर वर्ग का प्रयोग न करें। यदि आप एक गैर स्थैतिक वर्ग का उपयोग करते हैं और इसे तुरंत चालू करते हैं, तो आपको सफाई के बारे में चिंता करने की ज़रूरत नहीं है।
  • यदि यह कोई विकल्प नहीं है, तो मैं तर्क दूंगा कि यह सिंगलटन का उपयोग करने के लिए एक अच्छी स्थिति है। यह आपके ऑब्जेक्ट की प्रतिलिपि को तुरंत चालू करेगा और फाइनल को बाहर निकलने पर बुलाया जाएगा, लेकिन फिर भी आप इसे अधिकांश भाग के लिए एक स्थिर वर्ग की तरह व्यवहार करने की अनुमति देते हैं। आखिरकार, आपकी कक्षा पहले से ही स्थिर है और इसलिए सिंगलटन का उपयोग न करने के अधिकांश सामान्य कारणों को साझा करती है। जर्मन (और वीबी) में अफसोस, -
39

Herfried वैगनर एक excellent article यह कैसे लागू करने के लिए समझा लिखा है। फिर भी, कोड समझने योग्य होना चाहिए।

मैं इसे की कोशिश की है:

static readonly Finalizer finalizer = new Finalizer(); 

sealed class Finalizer { 
    ~Finalizer() { 
    Thread.Sleep(1000); 
    Console.WriteLine("one"); 
    Thread.Sleep(1000); 
    Console.WriteLine("two"); 
    Thread.Sleep(1000); 
    Console.WriteLine("three"); 
    Thread.Sleep(1000); 
    Console.WriteLine("four"); 
    Thread.Sleep(1000); 
    Console.WriteLine("five"); 
    } 
} 

यह ठीक उसी तरह काम करने के लिए के रूप में AppDomain.ProcessExit घटना करता है लगता है: finalizer सीए हो जाता है तीन सेकंड ...

+3

यह सबसे अच्छा जवाब है क्योंकि आप इस तरह से अपने" फाइनलजर "को डीबग कर सकते हैं, जबकि ऐपडोमेन। ProcessExit प्रतिनिधि आपको इसे डीबग करने की अनुमति नहीं देता है (कम से कम मेरे अनुभव में)। –

0
करने के लिए पोर्ट माइकल Damatov के जवाब (सी #)

जो Herfried लालकृष्ण वैगनर पर आधारित है। (वीबीएनईटी) यहां सी ++/सीएलआई संस्करण है:

ref class MyClass 
{ 
     ref class StaticFinalizer sealed 
     { 
      !StaticFinalizer(); 
     }; 
     static initonly StaticFinalizer^ stDestr = gcnew StaticFinalizer(); 
} 

MyClass::StaticFinalizer::!StaticFinalizer() 
{ 
    System::Diagnostics::Debug::WriteLine("In StaticFinalizer!"); 
} 

पीएस AppDomain.ProcessExit विधि की तरह, इस प्रक्रिया को असामान्य रूप से समाप्त कर दिया गया है (उदाहरण के लिए कार्य प्रबंधक से)। सावधानी का एक और शब्द यह है कि यदि MyClass सामान्य (templated) है, तो धारणा है कि इसके स्थिर कन्स्ट्रक्टर और स्थैतिक विनाशक को प्रति आवेदन निष्पादन एक बार से अधिक नहीं कहा जाएगा अब वैध नहीं है।

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