2010-09-15 4 views

उत्तर

45

हां, finally ब्लॉक निष्पादित किया गया है हालांकि प्रवाह try ब्लॉक छोड़ देता है - चाहे अंत तक पहुंचने, लौटने या अपवाद फेंकने से।

सी # 4 युक्ति से

, अनुभाग 8.10:

एक अंत में ब्लॉक के बयान हमेशा क्रियान्वित कर रहे हैं जब नियंत्रण छोड़ देता है एक बयान का प्रयास करें। यह सच है कि ब्रेक, जारी रखें, गोटो, या रिटर्न कथन निष्पादित करने के परिणामस्वरूप, या प्रयास कथन के अपवाद को प्रसारित करने के परिणामस्वरूप, सामान्य निष्पादन के परिणामस्वरूप नियंत्रण स्थानांतरण होता है।

(धारा 8.10 इस पर एक बहुत अधिक विस्तार, निश्चित रूप से है।)

ध्यान दें कि से पहले अंत में ब्लॉक हालांकि निष्पादित किया जाता है वापसी मान निर्धारित किया जाता है, इसलिए यदि आप ऐसा किया:

int Test() 
{ 
    int result = 4; 
    try 
    { 
     return result; 
    } 
    finally 
    { 
     // Attempt to subvert the result 
     result = 1; 
    } 
} 

... मान 4 अभी भी वापस आ जाएगा, 1 नहीं - finally ब्लॉक में असाइनमेंट का कोई प्रभाव नहीं पड़ेगा।

+0

आपके उत्तर के लिए धन्यवाद! – Liu

+0

यह नहीं कि यह वास्तव में बहुत व्यावहारिक महत्व है लेकिन आखिरकार ब्लॉक को निष्पादित नहीं किया जाता है यदि स्टैक ओवरफ्लो एक्सेप्शन होता है या यदि आप सिस्टम को कॉल करते हैं। पर्यावरण। फ़ेलफ़ास्ट (...) –

+0

बेशक, नियंत्रण कॉलर पर वापस नहीं आता है उन मामलों में। आप ब्लॉक कहने के बजाए प्रवाह * समाप्त * कह सकते हैं, ताकि स्कीट का बयान अभी भी हो। –

6

एक अंत में ब्लॉक हमेशा निष्पादित किया जाएगा और इस विधि से लौटने से पहले क्या होगा, तो आप सुरक्षित रूप से इस तरह कोड लिख सकते हैं:

try { 
    return "foo"; 
} finally { 
    // This will always be invoked 
} 

या आप डिस्पोजेबल संसाधनों के साथ काम कर रहे हैं अगर:

using (var foo = GetFoo()) 
{ 
    // foo is guaranteed to be disposed even if an exception is thrown 
    return foo.Bar(); 
} 
+0

आपके उत्तर के लिए धन्यवाद! – Liu

2

सी-शार्प में प्रयास या पकड़ने वाले ब्लॉक से लौटने पर आखिरकार ब्लॉक को निष्पादित किया जाएगा?

हाँ

तो कहीं भी होगी, लौटने के बाद या पहले?

पहले

3
दो-पास अपवाद हैंडलिंग, जो नेट खिड़कियों से विरासत के साथ

, आप ठीक नहीं कह सकता कि अंत में ब्लॉक से पहले नियंत्रण वापस फोन करने वाले के पास निष्पादित करता है।

आखिरकार ब्लॉक अधिक घोंसला वाले कॉल फ्रेम में अवरुद्ध होने के बाद निष्पादित हो जाएगा, और आखिरकार ब्लॉक और कम नेस्टेड कॉल फ्रेम में कैच ब्लॉक, जो लौटने से पहले अंत में चलने वाले ब्लॉक के साथ संगत है। लेकिन फेंक पॉइंट और कैच पॉइंट के बीच सभी अपवाद फ़िल्टर किसी भी आखिरकार ब्लॉक से पहले चलाए जाएंगे, जिसका मतलब है कि अपवाद की उपस्थिति में कुछ कॉलर कोड आखिरकार ब्लॉक से पहले चला सकते हैं।

जब नियंत्रण सामान्य रूप से ब्लॉक को छोड़ देता है (कोई अपवाद नहीं फेंक दिया जाता है), तो आखिर में कॉलर को नियंत्रण रिटर्न से पहले चला जाता है।

+0

+1 क्योंकि अपवाद फ़िल्टर उल्लेखनीय हैं ... लेकिन अपवाद फ़िल्टर के साथ भी, कॉलर पर वापस नियंत्रण से पहले निश्चित रूप से आखिरकार ब्लॉक चल रहा है। यह सिर्फ इतना है कि अपवाद फ़िल्टर इससे पहले भी चला सकते हैं। –

+0

ठीक है, नियंत्रण कॉलर के अपवाद फ़िल्टर को पास करता है, फिर आखिरकार ब्लॉक करने के लिए, फिर कॉलर के अपवाद हैंडलर पर। तो नियंत्रण अंततः ब्लॉक के पहले और बाद में कॉलर को पास करता है। –

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

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