2009-11-26 19 views
13

दो यह करने के लिए भागों:स्थिर वर्गों में विनाशक क्यों नहीं हो सकते हैं?

  1. एक स्थिर वर्ग एक स्थिर निर्माता हो सकता है, तो क्यों यह एक स्थिर नाशक नहीं हो सकता?

  2. सबसे अच्छा कामकाज क्या है? मेरे पास एक स्थैतिक वर्ग है जो COM ऑब्जेक्ट्स कनेक्शन के पूल का प्रबंधन करता है, और मुझे यह सुनिश्चित करने की ज़रूरत है कि प्रोग्राम में कहीं और कुछ उड़ाए जाने पर उनके कनेक्शन बंद/रिलीज़ हो जाएं।

उत्तर

18

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

उदाहरण के लिए, यदि आप अब है:

static class MyClass 
{ 
    public static void MyMethod() {...} 
} 

//Using the class: 
MyClass.MyMethod(); 

आप के बजाय होगा:

class MyClass : IDisposable 
{ 
    public static MyClass() 
    { 
     Instance=new MyClass(); 
    } 

    public static MyClass Instance {get; private set;} 

    public void MyMethod() {...} 

    public void Dispose() 
    { 
     //... 
    } 

    ~MyClass() 
    { 
     //Your destructor goes here 
    } 
} 

//Using the class: 
MyClass.Instance.MyMethod(); 

(गौर करें कि उदाहरण स्थिर निर्माता है, जो पहली बार शुरू हो जाती है में बन जाता है कि कक्षा वर्ग के किसी भी सदस्य का संदर्भ दिया जाता है)

+1

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

+0

यदि थ्रेडिंग का उपयोग किया जाएगा, तो कोड थ्रेड-सुरक्षित बनाने की आवश्यकता है। –

+1

थ्रेड सुरक्षा के साथ सिंगलटन पैटर्न करने के सभी अलग-अलग तरीकों पर यहां एक अच्छी मार्गदर्शिका है। http://csharpindepth.com/Articles/General/Singleton.aspx – Naz

3

1. क्यों? - एक प्रकार में एक कन्स्ट्रक्टर प्रति से नहीं हो सकता है क्योंकि आप आम तौर पर उदाहरणों पर रचनाकारों के बारे में सोचते हैं। आम तौर पर इसे कभी-कभी "स्थैतिक प्रारंभकर्ता" विधि के रूप में जाना जाता है लेकिन माइक्रोसॉफ्ट शब्दावली "टाइप कन्स्ट्रक्टर" (और इसमें विशेष प्रतिबंध हैं) का उपयोग करता है - आप इसे टाइप/क्लास में डालने के लिए कोड डालते हैं - अगर यह एक इंस्टेंस कन्स्ट्रक्टर होता है तो यह हो सकता है अतिभारित। "टाइप कन्स्ट्रक्टर" पर यह स्थिर प्रतिबंध इसलिए है क्योंकि .NET CLR ढेर पर कक्षा टेम्पलेट लोड करने के लिए ज़िम्मेदार है और इस परिस्थिति में पैरामीटर को निर्दिष्ट करने की अनुमति नहीं देता है (क्योंकि आप कभी भी तर्क कैसे पारित करेंगे)। चूंकि सख्ती से अर्थ में प्रोग्रामर टाइप कन्स्ट्रक्टर को बुलाए जाने के लिए ज़िम्मेदार नहीं है, इसलिए सीएलआर के डोमेन में प्रोग्रामर को स्थैतिक विनाशक को कोड करने की इजाजत नहीं दी जाएगी। सीएलआर अंततः ढेर से वर्ग टेम्पलेट को हटा देगा, लेकिन वर्ग टेम्पलेट का जीवनकाल इसके उदाहरणों से अधिक लंबा है, इसलिए आप इसे किसी भी तरह से संसाधन गहन नहीं करना चाहते हैं (उदा। डीबी कनेक्शन खोलें)।

2. क्या? - सिंगलटन यदि आप किसी ऐसे परिस्थिति में भाग रहे हैं जहां आपको लगता है कि आपको क्लास टेम्पलेट पर संसाधन खोलने और बाद में इसे नष्ट करने की आवश्यकता है, तो आप Singleton software pattern पर उस कक्षा के केवल एक उदाहरण के लिए विचार कर सकते हैं और संभवतः System.IDiposable इंटरफ़ेस को भी कार्यान्वित कर सकते हैं विनाशक के अलावा, सफाई के साथ सहायता। (मुझे लगता है कि किसी ने मुझे पहले ही आईडीस्पोजेबल कोड नमूना में पीटा है, इसलिए मैं यहां अपना समाधान समाप्त कर दूंगा।)

7
  1. स्टेटिक कक्षाओं में विनाशक नहीं हैं क्योंकि एक स्थैतिक वर्ग कभी नष्ट नहीं होता है।

  2. यदि आप इसके कई उदाहरण बनाना और नष्ट करना चाहते हैं, तो यह स्थिर नहीं होना चाहिए। इसे एक पूर्ण वर्ग बनाओ।

  3. किसी भी उद्देश्य के लिए विनाशकों का उपयोग नहीं किया जाना चाहिए। IDISposable/निपटान का प्रयोग करें।

+0

कंपाइलर आपको एक होने की अनुमति क्यों देता है? 'स्थैतिक ~ कक्षा नाम() {} 'क्या यह कभी नहीं चलता है? – Zapnologica

1

एक स्थैतिक वर्ग कभी नष्ट नहीं होता है। इसे कार्यक्रम के साथ समाप्त कर दिया गया है। आप स्टैटिक क्लास

+0

क्या आप वाकई एक कक्षा (प्रकार) कचरा नहीं एकत्रित हैं? –

+0

@ हेंकहोल्टरमैन हां। इकट्ठा करने के लिए कुछ भी नहीं है। चूंकि सभी गुणों/फ़ील्ड में कम से कम एक संदर्भ (स्थैतिक वर्ग) होता है और चूंकि स्थैतिक वर्ग का दायरा तब तक पहुंच तक पहुंच जाता है जब तक कार्यक्रम समाप्त नहीं हो जाता है, वहां संग्रह करने के लिए कुछ भी नहीं है –

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

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