ใน C # และใน Java (และภาษาอื่น ๆ ด้วย) ตัวแปรที่ประกาศในบล็อก "ลอง" ไม่ได้อยู่ในขอบเขตในบล็อก "catch" หรือ "สุดท้าย" ที่สอดคล้องกัน ตัวอย่างเช่นรหัสต่อไปนี้ไม่ได้รวบรวม:
try {
String s = "test";
// (more code...)
}
catch {
Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead
}
ในรหัสนี้ข้อผิดพลาดเวลาคอมไพล์เกิดขึ้นในการอ้างอิงถึง s ใน catch block เนื่องจาก s อยู่ในขอบเขตในลองบล็อกเท่านั้น (ใน Java ข้อผิดพลาดในการคอมไพล์คือ "s ไม่สามารถแก้ไขได้" ใน C # คือ "ชื่อ 'ไม่มีอยู่ในบริบทปัจจุบัน")
วิธีแก้ปัญหาทั่วไปของปัญหานี้ดูเหมือนว่าจะประกาศตัวแปรก่อนหน้าบล็อกลองแทนที่จะเป็นภายในบล็อกลอง:
String s;
try {
s = "test";
// (more code...)
}
catch {
Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead
}
อย่างไรก็ตามอย่างน้อยสำหรับฉัน (1) สิ่งนี้ให้ความรู้สึกเหมือนการแก้ปัญหาแบบ clunky และ (2) ส่งผลให้ตัวแปรมีขอบเขตที่ใหญ่กว่าโปรแกรมที่ตั้งใจไว้ (ส่วนที่เหลือทั้งหมดของวิธีแทนที่จะเป็นเฉพาะในบริบทของ ลองจับในที่สุด)
คำถามของฉันคืออะไร / เหตุผลใดที่อยู่เบื้องหลังการตัดสินใจออกแบบภาษานี้ (ใน Java, ใน C #, และ / หรือในภาษาอื่นที่เกี่ยวข้อง)