การเพิ่มคำตอบที่ Marc Gravell และ Jon Skeet ได้รับคำตอบเป็นสิ่งสำคัญที่จะต้องทราบวัตถุและประเภทการอ้างอิงอื่น ๆ ที่ทำงานคล้ายกันเมื่อถูกส่งคืน แต่มีความแตกต่างบางอย่าง
"อะไร" ที่ได้รับกลับมาตามตรรกะเดียวกับประเภทที่เรียบง่าย:
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;
}
}
}
เช่นเดียวกับการสร้างโฟลว์อื่น ๆ "try-return-final" มีที่และสามารถอนุญาตให้ใช้โค้ดที่ดูสะอาดกว่าการเขียนโครงสร้างที่คอมไพล์จริง แต่จะต้องใช้อย่างระมัดระวังเพื่อหลีกเลี่ยงของ gotcha