แบบฝึกหัด - สํารวจ Clear() และปรับขนาด()
- 15 นาที
เมื่อคุณยังคงพัฒนาตัวติดตามแท่นวางสินค้าสําหรับ บริษัท โลจิสติกส์อย่างต่อเนื่องอาจเป็นไปได้ว่าคุณต้องติดตามแท่นวางสินค้าใหม่และลบพาเลทเก่าออกจากระบบการติดตาม ดังนั้น คุณจะสร้างฟังก์ชันการติดตามที่อนุญาตให้เพิ่มและลบแท่นวางสินค้าได้อย่างไร?
ใช้วิธีการอาร์เรย์เพื่อล้างและปรับขนาดอาร์เรย์
วิธีการ Array.Clear() ช่วยให้คุณสามารถกําจัดเนื้อหาขององค์ประกอบเฉพาะในอาร์เรย์ของคุณ โดยแทนที่ด้วยค่าเริ่มต้นของอาร์เรย์ ตัวอย่างเช่น ถ้าคุณล้างองค์ประกอบในstringอาร์เรย์ ค่าที่ล้างแล้วจะถูกแทนที่ด้วยnull ในทํานองเดียวกัน เมื่อคุณล้างองค์ประกอบใน int อาร์เรย์ การแทนที่จะเป็น 0 (ศูนย์)
Array.Resize()ในทางกลับกันวิธีการช่วยให้คุณสามารถเพิ่มหรือลบองค์ประกอบออกจากอาร์เรย์ของคุณ
ลบหรือใช้ตัวดําเนินการข้อคิดเห็นบรรทัด
//เพื่อให้ข้อคิดเห็นเกี่ยวกับรหัสทั้งหมดจากแบบฝึกหัดก่อนหน้านี้อัปเดตโค้ดของคุณใน Visual Studio Code Editor ดังนี้:
string[] pallets = [ "B14", "A11", "B12", "A13" ]; Console.WriteLine(""); Array.Clear(pallets, 0, 2); Console.WriteLine($"Clearing 2 ... count: {pallets.Length}"); foreach (var pallet in pallets) { Console.WriteLine($"-- {pallet}"); }หมายเหตุ
ตัวอย่างนี้ใช้ ไวยากรณ์นิพจน์คอลเลกชัน ซึ่งนํามาใช้ใน C# 12 และได้รับการสนับสนุนใน .NET 10
ใช้เวลาสักครู่เพื่อโฟกัสที่บรรทัดของโค้ด
Array.Clear(pallets, 0, 2);ในส่วนนี้คุณกําลังใช้
Array.Clear()วิธีการ เพื่อล้างค่าที่จัดเก็บไว้ในองค์ประกอบของpalletsอาร์เรย์ ที่เริ่มต้นที่ดัชนี0และล้าง2องค์ประกอบบนเมนู ไฟล์ของ Visual Studio Code เลือก บันทึก
ต้องบันทึกไฟล์ Program.cs ก่อนที่จะสร้างหรือเรียกใช้โค้ด
ในแผง EXPLORER หากต้องการเปิดเทอร์มินัลที่ตําแหน่งโฟลเดอร์ TestProject ของคุณ ให้คลิกขวาที่ TestProject จากนั้นเลือก เปิดในเทอร์มินัลแบบรวม
แผงเทอร์มินัลควรเปิดขึ้น และควรมีพร้อมท์คําสั่งที่แสดงว่าเทอร์มินัลเปิดอยู่ไปยังตําแหน่งที่ตั้งโฟลเดอร์ TestProject ของคุณ
ที่พร้อมท์คําสั่งเทอร์มินัล เพื่อเรียกใช้โค้ดของคุณ ให้พิมพ์ dotnet run แล้วกด Enter
หมายเหตุ
ถ้าคุณเห็นข้อความ "ไม่พบโครงการที่จะเรียกใช้" ตรวจสอบให้แน่ใจว่าพร้อมท์คําสั่งเทอร์มินัลแสดงตําแหน่งที่ตั้งโฟลเดอร์ TestProject ที่คาดไว้ ตัวอย่าง:
C:\Users\someuser\Desktop\csharpprojects\TestProject>เมื่อคุณเรียกใช้รหัส คุณจะเห็นว่าค่าที่จัดเก็บไว้ในสององค์ประกอบแรกของอาร์เรย์ จะถูกล้างออก ใน
Lengthคุณสมบัติและforeachคําสั่ง องค์ประกอบยังคงมีอยู่ แต่ตอนนี้ว่างเปล่าแล้วClearing 2 ... count: 4 -- -- -- B12 -- A13
สตริงที่ว่างเปล่าเมื่อเทียบกับ null
เมื่อคุณใช้ Array.Clear()องค์ประกอบที่ล้างแล้วจะไม่อ้างอิงสตริงในหน่วยความจําอีกต่อไป ในความเป็นจริงองค์ประกอบชี้ไปที่ไม่มีอะไรเลย การชี้ไปที่ไม่มีอะไรเป็นแนวคิดที่สําคัญซึ่งอาจยากที่จะเข้าใจในตอนแรก
จะเกิดอะไรขึ้นถ้าคุณพยายามดึงค่าขององค์ประกอบที่ได้รับผลกระทบจาก Array.Clear() วิธีการ คุณสามารถทําได้หรือไม่
เข้าถึงค่าขององค์ประกอบที่ล้างแล้ว
จําเป็นต้องใช้วิธีการสองวิธีในการกําหนดค่าขององค์ประกอบที่ล้างแล้วเพื่อดูว่าคอมไพเลอร์ C# ทํางานร่วมกับค่า null อย่างไร
แทรกบรรทัดรหัสใหม่รอบ ๆ
Array.Clear(pallets, 0, 2);บรรทัดรหัสดังนี้:Console.WriteLine($"Before: {pallets[0]}"); Array.Clear(pallets, 0, 2); Console.WriteLine($"After: {pallets[0]}");ตรวจสอบรหัสของคุณควรตรงกับรายการโค้ดต่อไปนี้:
string[] pallets = [ "B14", "A11", "B12", "A13" ]; Console.WriteLine(""); Console.WriteLine($"Before: {pallets[0]}"); Array.Clear(pallets, 0, 2); Console.WriteLine($"After: {pallets[0]}"); Console.WriteLine($"Clearing 2 ... count: {pallets.Length}"); foreach (var pallet in pallets) { Console.WriteLine($"-- {pallet}"); }บันทึกไฟล์โค้ดของคุณ จากนั้นใช้ Visual Studio Code เพื่อเรียกใช้โค้ดของคุณ
คุณควรเห็นผลลัพธ์ต่อไปนี้:
Before: B14 After: Clearing 2 ... count: 4 -- -- -- B12 -- A13
ถ้าคุณมุ่งเน้นไปที่บรรทัดของเอาต์พุต After: คุณอาจคิดว่าค่าที่จัดเก็บไว้ใน pallets[0] เป็นสตริงที่ว่างเปล่า อย่างไรก็ตาม คอมไพเลอร์ C# จะแปลงค่า null เป็นสตริงว่างสําหรับการนําเสนอโดยนัย
เรียกใช้วิธีการของตัวช่วยเหลือสตริงบนองค์ประกอบที่ล้างข้อมูลแล้ว
เพื่อพิสูจน์ว่าค่าที่จัดเก็บไว้ใน pallets[0] หลังจากถูกล้างเป็น null คุณจะต้องปรับเปลี่ยนตัวอย่างโค้ดเพื่อเรียกใช้ToLower()เมธอด บนpallets[0] ถ้าเป็นสตริง ก็ควรใช้งานได้ดี แต่ถ้าค่าเป็น null ควรทําให้รหัสแสดงข้อยกเว้น
หากต้องการเรียกใช้
ToLower()วิธีการในแต่ละครั้งที่คุณพยายามเขียนpallets[0]ไปยังคอนโซล ให้อัปเดตโค้ดดังนี้:Console.WriteLine($"Before: {pallets[0].ToLower()}"); Array.Clear(pallets, 0, 2); Console.WriteLine($"After: {pallets[0].ToLower()}");ตรวจสอบให้แน่ใจว่าโค้ดของคุณตรงกับรายการโค้ดต่อไปนี้:
string[] pallets = [ "B14", "A11", "B12", "A13" ]; Console.WriteLine(""); Console.WriteLine($"Before: {pallets[0].ToLower()}"); Array.Clear(pallets, 0, 2); Console.WriteLine($"After: {pallets[0].ToLower()}"); Console.WriteLine($"Clearing 2 ... count: {pallets.Length}"); foreach (var pallet in pallets) { Console.WriteLine($"-- {pallet}"); }บันทึกไฟล์โค้ดของคุณ จากนั้นใช้ Visual Studio Code เพื่อเรียกใช้โค้ดของคุณ ในครั้งนี้ เมื่อคุณเรียกใช้รหัส คุณจะเห็นข้อความแสดงข้อผิดพลาดขนาดใหญ่ ถ้าคุณแยกวิเคราะห์ผ่านข้อความ คุณจะเห็นข้อความต่อไปนี้:
System.NullReferenceException: Object reference not set to an instance of an object.ข้อยกเว้นนี้จะเกิดขึ้นเนื่องจากความพยายามในการเรียกใช้เมธอด ในเนื้อหาของ
pallets[0]องค์ประกอบเกิดขึ้นก่อนที่ C# Compiler จะมีโอกาสแปลง null เป็นสตริงว่างโดยนัยศีลธรรมของเรื่องราวคือ
Array.Clear()การลบการอ้างอิงองค์ประกอบอาร์เรย์ไปยังค่าถ้ามีอยู่ เพื่อแก้ไขปัญหานี้ คุณอาจตรวจสอบ null ก่อนที่จะพยายามพิมพ์ค่าเพื่อหลีกเลี่ยงข้อผิดพลาด ให้เพิ่ม
ifคําสั่งก่อนเข้าถึงองค์ประกอบอาร์เรย์ที่อาจเป็น null
if (pallets[0] != null)
Console.WriteLine($"After: {pallets[0].ToLower()}");
ปรับขนาดอาร์เรย์เพื่อเพิ่มองค์ประกอบเพิ่มเติม
ถัดไป แก้ไขรายการรหัสจากขั้นตอนที่ 1 เพื่อรวมโค้ดเพื่อปรับขนาดอาร์เรย์ เมื่อเสร็จสิ้น โค้ดของคุณควรตรงกับรายการโค้ดต่อไปนี้:
string[] pallets = ["B14", "A11", "B12", "A13" ]; Console.WriteLine(""); Array.Clear(pallets, 0, 2); Console.WriteLine($"Clearing 2 ... count: {pallets.Length}"); foreach (var pallet in pallets) { Console.WriteLine($"-- {pallet}"); } Console.WriteLine(""); Array.Resize(ref pallets, 6); Console.WriteLine($"Resizing 6 ... count: {pallets.Length}"); pallets[4] = "C01"; pallets[5] = "C02"; foreach (var pallet in pallets) { Console.WriteLine($"-- {pallet}"); }ใช้เวลาสักครู่เพื่อโฟกัสที่เส้น
Array.Resize(ref pallets, 6);ที่นี่คุณกําลังเรียกใช้เมธอด ที่
Resize()ส่งผ่านในpalletsอาร์เรย์โดยการอ้างอิงโดยใช้refคําสําคัญ ในบางกรณี วิธีการต้องการให้คุณส่งผ่านอาร์กิวเมนต์ตามค่า (ค่าเริ่มต้น) หรือโดยการอ้างอิง (โดยใช้คําสําคัญ ref) เหตุผลว่าทําไมสิ่งนี้จึงจําเป็นต้องใช้คําอธิบายที่ยาวและซับซ้อนเกี่ยวกับวิธีการจัดการวัตถุใน .NET น่าเสียดายที่ที่อยู่นอกเหนือขอบเขตของมอดูลนี้ เมื่อไม่แน่ใจ ขอแนะนําให้ดู Intellisense หรือ Microsoft Docs เช่น วิธีการเรียกใช้วิธีการที่กําหนดอย่างถูกต้องในกรณีนี้ คุณกําลังปรับขนาด
palletsอาร์เรย์จากสี่องค์ประกอบเป็น6องค์ประกอบใหม่จะถูกเพิ่มที่ส่วนท้ายขององค์ประกอบปัจจุบัน สององค์ประกอบใหม่เป็น null จนกว่าคุณจะกําหนดค่าให้องค์ประกอบเหล่านี้บันทึกไฟล์โค้ดของคุณ จากนั้นใช้ Visual Studio Code เพื่อเรียกใช้โค้ดของคุณ เมื่อคุณเรียกใช้โค้ด คุณควรเห็นเอาต์พุตต่อไปนี้
Clearing 2 ... count: 4 -- -- -- B12 -- A13 Resizing 6 ... count: 6 -- -- -- B12 -- A13 -- C01 -- C02
ปรับขนาดอาร์เรย์เพื่อลบองค์ประกอบออก
ในทางกลับกัน คุณสามารถลบองค์ประกอบอาร์เรย์โดยใช้Array.Resize()
อัปเดตโค้ดของคุณใน Visual Studio Code Editor ดังนี้:
string[] pallets = [ "B14", "A11", "B12", "A13" ]; Console.WriteLine(""); Array.Clear(pallets, 0, 2); Console.WriteLine($"Clearing 2 ... count: {pallets.Length}"); foreach (var pallet in pallets) { Console.WriteLine($"-- {pallet}"); } Console.WriteLine(""); Array.Resize(ref pallets, 6); Console.WriteLine($"Resizing 6 ... count: {pallets.Length}"); pallets[4] = "C01"; pallets[5] = "C02"; foreach (var pallet in pallets) { Console.WriteLine($"-- {pallet}"); } Console.WriteLine(""); Array.Resize(ref pallets, 3); Console.WriteLine($"Resizing 3 ... count: {pallets.Length}"); foreach (var pallet in pallets) { Console.WriteLine($"-- {pallet}"); }บันทึกไฟล์โค้ดของคุณ จากนั้นใช้ Visual Studio Code เพื่อเรียกใช้โค้ดของคุณ เมื่อคุณเรียกใช้โค้ด คุณควรเห็นเอาต์พุตต่อไปนี้:
Clearing 2 ... count: 4 -- -- -- B12 -- A13 Resizing 6 ... count: 6 -- -- -- B12 -- A13 -- C01 -- C02 Resizing 3 ... count: 3 -- -- -- B12โปรดสังเกตว่าการ
Array.Resize()เรียกใช้ไม่ได้กําจัดองค์ประกอบ null สองรายการแรก แต่จะลบองค์ประกอบสามรายการสุดท้ายออก โดยเฉพาะอย่างยิ่ง มีการลบองค์ประกอบสามรายการล่าสุดออกแม้ว่าจะมีค่าสตริงอยู่ก็ตาม
คุณสามารถลบองค์ประกอบ null ออกจากอาร์เรย์ได้หรือไม่?
Array.Resize()หากวิธีการ ไม่ได้ลบองค์ประกอบที่ว่างเปล่าออกจากอาร์เรย์ จะมีวิธีการช่วยเหลืออื่นที่ทํางานโดยอัตโนมัติหรือไม่? ไม่ใช่ วิธีที่ดีที่สุดในการล้างองค์ประกอบจากอาร์เรย์คือการนับจํานวนองค์ประกอบที่ไม่ใช่ null โดยการวนซ้ําผ่านแต่ละหน่วยข้อมูลและเพิ่มตัวแปร (ตัวนับ) ถัดไป คุณจะสร้างอาร์เรย์ที่สองที่มีขนาดของตัวแปรตัวนับ ในตอนท้าย คุณจะวนรอบไปตามแต่ละองค์ประกอบในอาร์เรย์เดิม และคัดลอกค่าที่ไม่ใช่ null ลงในอาร์เรย์ใหม่
สรุป
นี่คือแนวคิดที่สําคัญบางประการที่คุณกล่าวถึงในหน่วยนี้:
-
Clear()ใช้วิธีการ เพื่อล้างค่าออกจากองค์ประกอบในอาร์เรย์ -
Resize()ใช้วิธีการ เพื่อเปลี่ยนจํานวนขององค์ประกอบในอาร์เรย์ โดยลบหรือเพิ่มองค์ประกอบจากจุดสิ้นสุดของอาร์เรย์ - องค์ประกอบอาร์เรย์ใหม่และองค์ประกอบที่ล้างแล้วเป็น null ซึ่งหมายความว่าองค์ประกอบเหล่านั้นไม่ได้ชี้ไปยังค่าในหน่วยความจํา
ตรวจสอบความรู้ของคุณ
คำติชม
หน้านี้มีประโยชน์หรือไม่
ไม่
ต้องการความช่วยเหลือในหัวข้อนี้หรือไม่
ต้องการลองใช้ Ask Learn เพื่อทําให้ชัดเจนหรือแนะนําคุณผ่านหัวข้อนี้หรือไม่