2009-08-25 16 views
10

मैं सी # में एक डब्ल्यूसीएफ सेवा लिख ​​रहा हूं। प्रारंभ में मेरे कार्यान्वयन में एक बार प्रारंभिक प्रारंभ करने के लिए एक स्थिर कन्स्ट्रक्टर था, लेकिन कुछ प्रारंभिकरण (अस्थायी रूप से) विफल हो सकता है।टाइप प्रारंभकर्ता (स्थिर कन्स्ट्रक्टर) अपवाद हैंडलिंग

ऐसा प्रतीत होता है कि स्थैतिक रचनाकारों को केवल एक बार बुलाया जाता है, भले ही पहले (असफल) प्रयास ने अपवाद फेंक दिया हो? मेरी कक्षा को तुरंत चालू करने के बाद के किसी भी प्रयास को वास्तव में कोड के निष्पादित किए बिना TypeInitializationException के साथ विफल हो जाएगा।

सी # भाषा विनिर्देश बताता है कि एक स्थिर कन्स्ट्रक्टर को एक बार में बुलाया जाता है, लेकिन मूल रूप से यह एक त्रुटि में अपवाद करता है जिसे आप कभी भी ठीक नहीं कर सकते हैं, भले ही आप इसे पकड़ लें?

क्या मुझे यहां कुछ याद आ रही है? मुझे लगता है कि मुझे सेवा के इंस्टेंस कन्स्ट्रक्टर के लिए दूरस्थ रूप से खतरनाक कुछ भी ले जाना चाहिए और मैन्युअल रूप से जांच करना चाहिए कि कक्षा प्रारंभिकता पहले से सफलतापूर्वक पूरी हो चुकी है या नहीं?

उत्तर

3

तो आप महत्वपूर्ण हिस्सों को कोशिश/पकड़ में लपेट सकते हैं और कम से कम इसका मतलब है कि प्रकार प्रारंभ करने में विफल नहीं होगा, लेकिन निश्चित रूप से यदि प्रारंभिक कोड महत्वपूर्ण है, तो यह व्यवहार वास्तव में अच्छा है - प्रकार नहीं है इस अनियमित राज्य में प्रयोग योग्य।

दूसरा विकल्प इसे सिंगलटन के रूप में करना है - हर बार जब आप कोशिश करते हैं और इंस्टेंस प्राप्त करते हैं तो आप सही प्रकार तक बना सकते हैं, जब तक कि आप सफल न हों, भले ही यह पहली बार विफल हो।

अगर आपको पहले (या दूसरे आदि) समय को वापस करने के मामले में आपको कॉलर पर कुछ त्रुटि प्रबंधन की आवश्यकता होगी।

संपादित करें: और यदि आप एक सिंगलटन नहीं करना चाहते, तो बस अपने उदाहरण निर्माता स्थिर भागों प्रारंभ है

उदा

private object _lock = new object() 
private bool _initialized; 

public T() 
{ 
    lock(_lock) 
    { 
     if(!_initialized) 
     { 
     try 
     { 
      //Do static stuff here 
     } 
     catch(Exception ex_) 
     { 
      //Handle exception 
     } 
     } 
    } 
} 
+1

यह वास्तव में मेरे पास है, सिवाय इसके कि मैं कुछ डबल चेक लॉकिंग का उपयोग करता हूं और मेरा' _initialized 'बूल' अस्थिर 'है (नहीं होना चाहिए डबल चेक लॉकिंग के बिना जरूरी हो) – Thorarin

3

यहां सबक बहुत आसान है: एक स्थिर निर्माता में कुछ भी न करें जो उचित रूप से असफल हो सकता है।

+0

एमएसडीएन का उल्लेख है कि प्रकार अनियंत्रित रहेगा, लेकिन मैंने तुरंत इसका अर्थ यह नहीं लिया कि कभी भी एक उदाहरण बनाना असंभव होगा। मैं वास्तव में इस बारे में एक और स्पष्ट चेतावनी की उम्मीद होगी। चारों ओर काम करने के लिए कोई बड़ा सौदा नहीं है, लेकिन यह स्थिर रचनाकारों को बहुत कम उपयोगी बनाता है :( – Thorarin

+0

@ थोरिनिन - केवल ऐपडोमेन के जीवनकाल के लिए। 'प्रकार उस एप्लिकेशन डोमेन के जीवनकाल के लिए अनियंत्रित रहेगा जिसमें आपका प्रोग्राम चल रहा है 'एमएसडीएन से http://msdn.microsoft.com/en-us/library/k9x6w0hc.aspx – VoodooChild

0

वैकल्पिक हल मैं अतीत में प्रयोग एक सिंगलटन पैदा कर रही है। एक स्थिर कन्स्ट्रक्टर विफल करें अगर विफलता का मतलब है कि पूरा एप्लिकेशन नहीं चलाया जा सकता है।

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