ข้อผิดพลาดทั่วไปในการวนซ้ำ
แก้ไขข้อมูลระหว่างวนซ้ำ
ข้อผิดพลาดทั่วไปในการวนซ้ำ เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
ข้อผิดพลาดที่พบบ่อยในการวนซ้ำ
ลูปนั้นเรียบง่าย แต่มีข้อผิดพลาดบางอย่างที่ทำให้ผู้เริ่มต้นสับสนซ้ำแล้วซ้ำเล่า
ในบทเรียนนี้ เราจะดูข้อผิดพลาดที่พบบ่อยที่สุดในการวนซ้ำ และวิธีหลีกเลี่ยงข้อผิดพลาดเหล่านั้น
การแก้ไขระหว่างวนซ้ำ
ข้อผิดพลาดที่ใหญ่ที่สุดคือการเปลี่ยนแปลงคอลเลกชันขณะที่คุณใช้ foreach วนซ้ำผ่านคอลเลกชันนั้น
การเพิ่มหรือนำรายการออกระหว่างการวนซ้ำจะทำให้เกิด InvalidOperationException ขณะโปรแกรมทำงาน
foreach (var n in list)
{
if (n < 0) list.Remove(n); // ERROR at runtime
}วิธีแก้ไขที่ปลอดภัย
หากต้องการนำรายการออกระหว่างการวนซ้ำ ให้ใส่สำเนาของคอลเลกชันไว้ในลูป หรือรวบรวมรายการไว้ก่อนแล้วค่อยนำออกภายหลัง
การวนซ้ำผ่าน list.ToList() จะทำให้คุณมีสำเนาภาพรวมแยกต่างหากสำหรับเดินดู
var list = new List<int> { 1, -2, 3, -4 };
foreach (var n in list.ToList())
{
if (n < 0) list.Remove(n);
}
Console.WriteLine(string.Join(",", list));การคลาดเคลื่อนหนึ่งตำแหน่งในลูป for
ในการใช้ลูป for แบบกำหนดเอง หากใช้ <= แทน < จะทำให้พยายามอ่านเลยจุดสิ้นสุด
ดัชนีที่ใช้งานได้จะเริ่มตั้งแต่ 0 ถึง Length - 1 ดังนั้นเงื่อนไขควรเป็น i < Length
for (int i = 0; i <= arr.Length; i++) // BUG: <= goes too far
{
Console.WriteLine(arr[i]);
}IndexOutOfRange
การคลาดเคลื่อนหนึ่งตำแหน่งนี้ทำให้เกิด IndexOutOfRangeException
foreach ช่วยหลีกเลี่ยงปัญหานี้ได้ทั้งหมด เพราะไม่เคยใช้ดัชนี ควรเลือกใช้เมื่อคุณต้องการเพียงอ่านรายการ
string[] arr = { "a", "b", "c" };
for (int i = 0; i < arr.Length; i++) // correct: < Length
{
Console.WriteLine(arr[i]);
}คาดหวังให้ foreach เปลี่ยนรายการ
การกำหนดค่าให้ตัวแปรของลูปจะไม่เปลี่ยนแปลงคอลเลกชัน และสำหรับชนิดค่า ตัวแปรนั้นก็เป็นเพียงสำเนาอยู่แล้ว
หากต้องการอัปเดตรายการ ให้ใช้ลูป for ร่วมกับการเข้าถึงด้วยดัชนี
int[] nums = { 1, 2, 3 };
for (int i = 0; i < nums.Length; i++)
{
nums[i] = nums[i] * 10;
}
Console.WriteLine(string.Join(",", nums));คอลเลกชันที่เป็นค่าว่างอ้างอิง
การเรียกใช้ foreach กับการอ้างอิงที่เป็น null จะทำให้เกิด NullReferenceException
คอลเลกชันว่างสามารถใช้งานได้ แต่ null ใช้งานไม่ได้ ให้ตรวจสอบหรือกำหนดค่าเริ่มต้นก่อนเริ่มวนซ้ำ
List<int> data = null;
if (data != null)
{
foreach (var x in data) Console.WriteLine(x);
}ความสับสนเกี่ยวกับขอบเขตตัวแปร
ตัวแปรของลูปจะมีอยู่เฉพาะภายในเนื้อหาของลูปเท่านั้น
การพยายามใช้ตัวแปรนี้หลังลูปจะทำให้เกิดข้อผิดพลาดขณะคอมไพล์ เพราะตัวแปรอยู่นอกขอบเขตเมื่อสิ้นสุดลูป
foreach (var n in nums)
{
Console.WriteLine(n);
}
// Console.WriteLine(n); // ERROR: n not in scope hereลืมวงเล็บปีกกา
หากไม่มีวงเล็บปีกกา จะมีเพียงคำสั่งถัดไปหนึ่งคำสั่งเท่านั้นที่เป็นส่วนหนึ่งของลูป
เรื่องนี้อาจทำให้ตรรกะเสียหายโดยไม่รู้ตัว ควรใช้วงเล็บปีกกาเสมอสำหรับเนื้อหาที่มีหลายบรรทัด เพื่อให้เจตนาของโค้ดชัดเจน
foreach (var n in nums)
Console.WriteLine(n);
Console.WriteLine("runs once, not per item");ความเสี่ยงของลูป while ที่ไม่สิ้นสุด
ต่างจาก foreach ตรงที่ลูป while อาจทำงานตลอดไป หากเงื่อนไขไม่กลายเป็นเท็จ
ตรวจสอบให้แน่ใจเสมอว่ามีบางสิ่งภายในลูปเคลื่อนเข้าใกล้เงื่อนไขการออกจากลูป
int i = 0;
while (i < 3)
{
Console.WriteLine(i);
i++; // forgetting this would loop forever
}เลือกลูปให้เหมาะสม
อ่านทุกรายการโดยไม่ต้องใช้ดัชนี → foreach
ต้องใช้ดัชนีหรือต้องแก้ไขค่าในตำแหน่งเดิม → for ทำซ้ำจนกว่าเงื่อนไขจะเปลี่ยนแปลง → while
ตรวจสอบความเข้าใจ
ทดสอบสิ่งที่คุณได้เรียนรู้เกี่ยวกับข้อผิดพลาดในการวนซ้ำ
สรุปทบทวน
คุณได้เรียนรู้ให้หลีกเลี่ยงการแก้ไขคอลเลกชันระหว่างใช้ foreach หลีกเลี่ยงข้อผิดพลาดแบบคลาดเคลื่อนหนึ่งตำแหน่งที่เกิดจาก <= รวมถึงคอลเลกชันที่เป็น null และความสับสนเรื่องขอบเขต
เลือกใช้ foreach เพื่ออ่าน ใช้ for เพื่อแก้ไขตามดัชนี และใช้ while สำหรับลูปตามเงื่อนไขที่มีทางออกชัดเจน
คำถามที่พบบ่อย
บทเรียน “ข้อผิดพลาดทั่วไปในการวนซ้ำ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ข้อผิดพลาดทั่วไปในการวนซ้ำ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ข้อผิดพลาดทั่วไปในการวนซ้ำ”
แก้ไขข้อมูลระหว่างวนซ้ำ คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “ข้อผิดพลาดทั่วไปในการวนซ้ำ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม
ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ลูป foreach
- วนซ้ำผ่านคอลเลกชัน
- break และ continue
- ข้อผิดพลาดทั่วไปในการวนซ้ำ