2013-04-16 18 views
5

मान लें कि ब्लॉक के अंदर return कथन के साथ आपके पास सी # विधि है। क्या finally ब्लॉक में वापसी मान को संशोधित करना संभव है?क्या सी # में अंत में खंड में वापसी मूल्य को बदलना संभव है?

स्पष्ट दृष्टिकोण, finally ब्लॉक में return का उपयोग कर, काम करेंगे नहीं:

String Foo() 
{ 
    try 
    { 
     return "A"; 
    } 
    finally 
    { 
     // Does not compile: "Control cannot leave the body of a finally clause" 
     return "B"; 
    } 
} 

दिलचस्प है, इस वीबी में किया जा सकता: ReturnFinally अंदर से मना किया है, लेकिन हम दुरुपयोग कर सकते हैं तथ्य यह है कि (शायद पीछे की संगतता के कारणों के लिए) वीबी अभी भी वापसी मूल्य को विधि नाम पर निर्दिष्ट करके संशोधित करने की अनुमति देता है:

Function Foo() As String ' Returns "B", really! 
    Try 
     Return "A" 
    Finally 
     Foo = "B" 
    End Try 
End Function 

नोट्स:

  1. ध्यान दें कि मैं इस सवाल विशुद्ध रूप से वैज्ञानिक जिज्ञासा से बाहर पूछना; जाहिर है, इस तरह का कोड अत्यधिक त्रुटि-प्रवण और भ्रमित है और कभी लिखा नहीं जाना चाहिए।

  2. ध्यान दें कि मैं try { var x = "A"; return x; } finally { x = "B"; } पूछ रहा हूं। मुझे पता है कि यह वापसी मूल्य और I understand why this happens नहीं बदलता है। मैं जानना चाहता हूं कि अंततः ब्लॉक के माध्यम से प्रयास ब्लॉक के अंदर रिटर्न वैल्यू सेट को बदलने के तरीके हैं।

+7

वीबीएनईटी का दुरुपयोग करना बंद करें - इसे पहले से ही पर्याप्त दुर्व्यवहार हो जाता है! – Oded

+1

सिर्फ इसलिए कि आप * वीबी में ऐसा कर सकते हैं इसका मतलब यह नहीं है कि आपको * चाहिए *! –

+2

वीबीएनईटी का उपयोग बंद करो - इसे पहले से ही पर्याप्त उपयोग मिल जाता है! – PhonicUK

उत्तर

18

मान लें आप एक वापसी कथन एक कोशिश ब्लॉक के अंदर के साथ एक सी # विधि है। अंत में ब्लॉक में वापसी मूल्य को संशोधित करना संभव है?

सं

आप फिर भी बाहर जाने वाले मान संशोधित कर सकते हैं अंत में ब्लॉक: सिर्फ इसलिए कि वहाँ था मूल रूप से एक "वापस 123"

static int M() 
{ 
    try 
    { 
     try 
     { 
      return 123; 
     } 
     finally 
     { 
      throw new Exception(); 
     } 
    } 
    catch 
    { 
     return 456; 
    } 
} 

मतलब यह नहीं है कि विधि होगा 123 लौटें, अगर आपका प्रश्न वास्तव में क्या हो रहा है। इस विधि देता है 456.

+1

बहुत दिलचस्प है। ऐसा लगता है कि एकमात्र छूट नियम तब होता है जब 'अंत में' ब्लॉक के अंदर एक अपवाद फेंक दिया जाता है। –

+4

@ ब्रैडएम: आप सही हैं। अधिक आम तौर पर: 'अंत में' ब्लॉक के भीतर केवल तीन संभावित नियंत्रण प्रवाह होते हैं: (1) कभी नहीं छोड़ें, (2) सामान्य रूप से छोड़ दें, या (3) फेंक दिया अपवाद के माध्यम से छोड़ दें। अन्य नियंत्रण प्रवाह 'रिटर्न', 'गोटो ',' ब्रेक ',' जारी रखें ',' उपज रिटर्न ',' उपज ब्रेक 'और' प्रतीक्षा 'जैसे अंततः ब्लॉक में कानूनी नहीं हैं, या केवल तभी अनुमति दी जाती है जब वे कूद जाएं अंत में ब्लॉक * के भीतर एक स्थान *। –

-1

आप एक ही प्रभाव के दृष्टिकोण के लिए निम्न कर सकते हैं: (

private string myFunction() 
{ 
    string result = String.Empty; 
    try 
    { 
     //.. 
     result = "something"; 
    } 
    finally 
    { 
     result = "something else"; 
    } 
    return result; 
} 
+5

फिर से प्रश्न पढ़ें। सवाल शुरू होता है "मान लीजिए कि आपके पास एक कोशिश ब्लॉक में वापसी विवरण है"। आपके प्रयास ब्लॉक में वापसी विवरण कहां है? –

+1

मेरा जवाब फिर से पढ़ें .. ".. समान प्रभाव से संपर्क करने के लिए" .. यह एक विकल्प है, समाधान नहीं, क्योंकि यह संभव नहीं है। वोट करने का कोई कारण नहीं .. – Yami

-1

उद्धृत वीबी दृष्टिकोण के साथ एक करीबी सादृश्य return द्वारा इस्तेमाल किया चर करने के लिए एक संशोधित मान निर्दिष्ट किया जाएगा जो है नियंत्रण की वापसी) का एक बिंदु के संरक्षण के लाभ:

string returnResult; 

try 
{ 
    returnResult = "A"; 
} 
finally 
{ 
    returnResult = "B"; 
} 

return returnResult; 
+1

फिर से प्रश्न पढ़ें। सवाल शुरू होता है "मान लीजिए कि आपके पास एक कोशिश ब्लॉक में वापसी विवरण है"। आपके प्रयास ब्लॉक में वापसी विवरण कहां है? –

+0

उपयोगकर्ता को यह कहने के साथ SO में कुछ भी गलत नहीं है "ऐसा मत करो, इसे इसके बजाय करें" - बस उन्हें अपने प्रश्न का उत्तर देना हमेशा सही काम नहीं है अगर वे क्या करने की कोशिश कर रहे हैं गलत है – PhonicUK

+6

प्रश्न का अंतिम अनुच्छेद इंगित करता है कि मूल पोस्टर को पता है कि यह खराब शैली है। –

0

VB.NET संस्करण VB6 युग से एक अल्पविकसित निर्माण जिसमें आप समारोह के नाम के मूल्य बताए द्वारा कोई मान का दुरुपयोग करती है ।

क्या सच में जानना दिलचस्प अगर वहाँ आईएल में एक फर्क है जब एक मानक return कथन का उपयोग के रूप में myFunc = "B" करने का विरोध किया, के रूप में try...catch...finally अर्थ विज्ञान हुक्म है कि यह दिए गए मान को बदलने के लिए असंभव हो जाएगा प्रतीत होता है का उत्पादन किया है किया जाएगा return कथन द्वारा।

+1

'MyFunc =" B "' वापस नहीं आता है इसलिए आईएल एक जैसा नहीं होगा –

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