मार्क ग्रेवेल और जॉन स्कीट द्वारा दिए गए उत्तरों पर जोड़ना, वस्तुओं को नोट करना महत्वपूर्ण है और अन्य संदर्भ प्रकार लौटने पर समान व्यवहार करते हैं लेकिन कुछ मतभेद हैं।
"क्या" है कि वापस आ जाता है उसी तर्क के रूप में इस सरल प्रकार:
class Test {
public static Exception AnException() {
Exception ex = new Exception("Me");
try {
return ex;
} finally {
// Reference unchanged, Local variable changed
ex = new Exception("Not Me");
}
}
}
संदर्भ लौटाए जा रही है से पहले स्थानीय चर में अंत में ब्लॉक एक नया संदर्भ असाइन किया गया है पहले से ही मूल्यांकन किया गया है।
निष्पादन अनिवार्य है:
class Test {
public static Exception AnException() {
Exception ex = new Exception("Me");
Exception CS$1$0000 = null;
try {
CS$1$0000 = ex;
} finally {
// Reference unchanged, Local variable changed
ex = new Exception("Not Me");
}
return CS$1$0000;
}
}
अंतर यह अभी भी वस्तु जो अनपेक्षित व्यवहार में परिणाम कर सकते अगर आप सावधान नहीं हैं के गुणों/तरीकों का उपयोग कर परिवर्तनशील प्रकार संशोधित करने के लिए संभव हो जाएगा है।
class Test2 {
public static System.IO.MemoryStream BadStream(byte[] buffer) {
System.IO.MemoryStream ms = new System.IO.MemoryStream(buffer);
try {
return ms;
} finally {
// Reference unchanged, Referenced Object changed
ms.Dispose();
}
}
}
कोशिश-वापसी के बारे में विचार करने के लिए दूसरी बात यह है कि अंततः "संदर्भ द्वारा" पारित पैरामीटर को रिटर्न के बाद संशोधित किया जा सकता है। केवल वापसी मूल्य का मूल्यांकन किया गया है और लौटाए जाने वाले अस्थायी चर में संग्रहीत किया गया है, किसी अन्य चर को अभी भी सामान्य तरीके से संशोधित किया गया है। आखिरकार इस तरह से अवरुद्ध होने तक आउट पैरामीटर का अनुबंध अनुपलब्ध हो सकता है।
class ByRefTests {
public static int One(out int i) {
try {
i = 1;
return i;
} finally {
// Return value unchanged, Store new value referenced variable
i = 1000;
}
}
public static int Two(ref int i) {
try {
i = 2;
return i;
} finally {
// Return value unchanged, Store new value referenced variable
i = 2000;
}
}
public static int Three(out int i) {
try {
return 3;
} finally {
// This is not a compile error!
// Return value unchanged, Store new value referenced variable
i = 3000;
}
}
}
किसी अन्य प्रवाह का निर्माण की तरह "की कोशिश-रिटर्न-अंत में" अपनी जगह है और क्लीनर संरचना यह वास्तव में को संकलित लिखने की तुलना में कोड तलाश के लिए अनुमति दे सकते हैं। लेकिन गेटचा से बचने के लिए इसे सावधानी से इस्तेमाल किया जाना चाहिए।
यह बिल्कुल ठीक नहीं है ocdedio ने कहा: अंत में वापसी मूल्य की गणना के बाद और वास्तव में funczion से वापस आने से पहले निष्पादित किया जाता है ??? – mmmmmmmm
मुझे लगता है कि नीचे जॉन स्कीट का उत्तर अधिक स्पष्ट और सटीक है। –
"अपवाद-नियंत्रित ब्लॉक" मुझे लगता है कि इस परिदृश्य में अपवाद और अपवाद हैंडलिंग के साथ कुछ लेना देना नहीं है। यह इस बारे में है कि .NET अंततः _resource_ गार्ड निर्माण को लागू करता है। –