0Pricing
C# Academy · บทเรียน

ข้อผิดพลาดทั่วไปในการวนซ้ำ

แก้ไขข้อมูลระหว่างวนซ้ำ

ข้อผิดพลาดทั่วไปในการวนซ้ำ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ลูป foreach
  2. วนซ้ำผ่านคอลเลกชัน
  3. break และ continue
  4. ข้อผิดพลาดทั่วไปในการวนซ้ำ
← กลับไปที่ C# Academy