ตามที่คนอื่น ๆ ระบุไว้ แต่เน้นไปที่ข้อยกเว้นจริงๆแล้วมันเกี่ยวกับการจัดการการควบคุมการถ่ายโอนที่ไม่ชัดเจน
ในใจของคุณคุณอาจนึกถึงสถานการณ์เช่นนี้:
public static object SafeMethod()
{
foreach(var item in list)
{
try
{
try
{
//do something that won't transfer control outside
}
catch
{
//catch everything to not throw exceptions
}
}
finally
{
if (someCondition)
//no exception will be thrown,
//so theoretically this could work
continue;
}
}
return someValue;
}
ในทางทฤษฎีคุณสามารถติดตามขั้นตอนการควบคุมและพูดว่าใช่นี่คือ "ตกลง" ไม่มีการโยนข้อยกเว้นไม่มีการถ่ายโอนการควบคุม แต่นักออกแบบภาษา C # มีปัญหาอื่น ๆ อยู่ในใจ
ข้อยกเว้นที่ถูกโยน
public static void Exception()
{
try
{
foreach(var item in list)
{
try
{
throw new Exception("What now?");
}
finally
{
continue;
}
}
}
catch
{
//do I get hit?
}
}
Goto ที่น่ากลัว
public static void Goto()
{
foreach(var item in list)
{
try
{
goto pigsfly;
}
finally
{
continue;
}
}
pigsfly:
}
การกลับมา
public static object ReturnSomething()
{
foreach(var item in list)
{
try
{
return item;
}
finally
{
continue;
}
}
}
เลิก
public static void Break()
{
foreach(var item in list)
{
try
{
break;
}
finally
{
continue;
}
}
}
ดังนั้นในการสรุปใช่ในขณะที่มีเป็นเล็กน้อยความเป็นไปได้ของการใช้continueในสถานการณ์ที่ควบคุมไม่ได้ถูกโอน แต่การจัดการที่ดี (ส่วนใหญ่?) ในกรณีที่เกี่ยวข้องกับข้อยกเว้นหรือreturnบล็อก นักออกแบบภาษารู้สึกว่าสิ่งนี้จะคลุมเครือเกินไปและ (น่าจะ) เป็นไปไม่ได้ที่จะมั่นใจได้ว่าในเวลาคอมไพล์ของคุณcontinueจะถูกใช้เฉพาะในกรณีที่ไม่มีการถ่ายโอนโฟลว์การควบคุม