แบบฝึกหัด - ค้นหาชนิดการอ้างอิง
- 8 นาที
ชนิดการอ้างอิงรวมถึงอาร์เรย์ คลาส และสตริง ประเภทการอ้างอิงจะแตกต่างกันจากชนิดของค่าเกี่ยวกับวิธีจัดเก็บค่าเมื่อแอปพลิเคชันกําลังดําเนินการ
ในแบบฝึกหัดนี้ คุณจะได้เรียนรู้ว่าชนิดการอ้างอิงแตกต่างจากชนิดค่าอย่างไร และวิธีการใช้ตัว new ดําเนินการ ในการเชื่อมโยงตัวแปรกับค่าในหน่วยความจําของคอมพิวเตอร์
ประเภทการอ้างอิงแตกต่างจากชนิดของค่าอย่างไร
ตัวแปรชนิดค่าจะจัดเก็บค่าไว้ในพื้นที่เก็บข้อมูลที่เรียกว่า สแตกโดยตรง สแตกเป็นการจัดสรรหน่วยความจําให้กับรหัสที่กําลังทํางานอยู่บน CPU (หรือที่เรียกว่าสแตกเฟรมหรือเฟรมการเปิดใช้งาน) เมื่อเฟรมสแตกดําเนินการเสร็จสิ้นค่าในสแตกจะถูกลบออก
ตัวแปรชนิดการอ้างอิงจะจัดเก็บค่าในขอบเขตหน่วยความจําแยกต่างหากที่เรียกว่า ฮีพ ฮีพเป็นพื้นที่หน่วยความจําที่ใช้ร่วมกันในแอปพลิเคชันจํานวนมากที่ทํางานบนระบบปฏิบัติการในเวลาเดียวกัน รันไทม์ .NET สื่อสารกับระบบปฏิบัติการเพื่อกําหนดที่อยู่หน่วยความจําที่พร้อมใช้งาน และร้องขอที่อยู่ที่สามารถจัดเก็บค่า รันไทม์ .NET จะจัดเก็บค่า และจากนั้นส่งกลับที่อยู่หน่วยความจําไปยังตัวแปร เมื่อรหัสของคุณใช้ตัวแปร .NET Runtime จะค้นหาที่อยู่ที่เก็บอยู่ในตัวแปรอย่างราบรื่น และดึงค่าที่ถูกเก็บไว้ในนั้น
ถัดไปคุณจะเขียนโค้ดบางอย่างที่แสดงแนวคิดเหล่านี้ได้ชัดเจนยิ่งขึ้น
กําหนดตัวแปรชนิดการอ้างอิง
ลบหรือใช้ตัวดําเนินการข้อคิดเห็นบรรทัด
//เพื่อให้ข้อคิดเห็นเกี่ยวกับรหัสทั้งหมดจากแบบฝึกหัดก่อนหน้านี้อัปเดตโค้ดของคุณใน Visual Studio Code Editor ดังนี้:
int[] data;รหัสก่อนหน้านี้จะกําหนดตัวแปรที่สามารถเก็บค่าชนิด
intอาร์เรย์ในขั้นตอนนี้
dataเป็นเพียงตัวแปรที่สามารถเก็บการอ้างอิง หรือเป็นที่อยู่หน่วยความจําของค่าในฮีพ เนื่องจากไม่ได้ชี้ไปยังที่อยู่หน่วยความจํา ระบบจึงเรียกว่า การอ้างอิง nullสร้างอินสแตนซ์ของ
intอาร์เรย์โดยใช้คําnewสําคัญอัปเดตรหัสของคุณใน Visual Studio Code Editor เพื่อสร้างและกําหนดอินสแตนซ์ใหม่ของ
intอาร์เรย์ โดยใช้โค้ดต่อไปนี้:int[] data; data = new int[3];คํา
newหลักแจ้งให้ .NET Runtime สร้างอินสแตนซ์ของintอาร์เรย์ และจากนั้นประสานงานกับระบบปฏิบัติการเพื่อจัดเก็บอาร์เรย์ที่ปรับขนาดสําหรับค่าอินทสามค่าในหน่วยความจํา รันไทม์ .NET ต้องดําเนินการและแสดงที่อยู่หน่วยความจําของอาร์เรย์ใหม่intสุดท้าย ที่อยู่หน่วยความจําจะถูกเก็บไว้ในข้อมูลตัวแปร องค์ประกอบintของอาร์เรย์จะมีค่าเริ่มต้นเป็น ค่า0เนื่องจากเป็นค่าเริ่มต้นของintปรับเปลี่ยนตัวอย่างโค้ดเพื่อดําเนินการทั้งสองในบรรทัดเดียวของโค้ด
โดยทั่วไปแล้ว รหัสสองบรรทัดในขั้นตอนก่อนหน้านี้จะถูกย่อลงเป็นบรรทัดเดียวของรหัสเพื่อประกาศตัวแปรและสร้างอินสแตนซ์ใหม่ของ
intอาร์เรย์ แก้ไขโค้ดจากขั้นตอนที่ 3 ไปเป็นดังต่อไปนี้int[] data = new int[3];แม้ว่าจะไม่มีผลลัพธ์ที่ควรสังเกต แต่หวังว่าแบบฝึกหัดนี้เพิ่มความชัดเจนให้กับไวยากรณ์ C# เกี่ยวข้องกับขั้นตอนของกระบวนการสําหรับการทํางานกับชนิดการอ้างอิง
อะไรคือความแตกต่างเกี่ยวกับชนิดข้อมูลสตริง C#
ชนิดข้อมูล string เป็นชนิดการอ้างอิงเช่นกัน คุณอาจสงสัยว่า เหตุใดตัวดําเนินการจึง new ไม่ถูกนํามาใช้เมื่อประกาศสตริง นี่คือความสะดวกสบายอย่างแท้จริงที่นักออกแบบของ C# ซื้อ
stringเนื่องจากชนิดข้อมูลถูกใช้บ่อย ดังนั้นคุณสามารถใช้รูปแบบนี้ได้:
string shortenedString = "Hello World!";
Console.WriteLine(shortenedString);
ในเบื้องหลัง อย่างไรก็ตาม อินสแตนซ์ใหม่ของ System.String จะถูกสร้างและเตรียมใช้งานเป็น "Hello World!"
ข้อกังวลเชิงปฏิบัติโดยใช้ค่าและชนิดการอ้างอิง
-
ชนิดค่า (int): ในตัวอย่าง
val_Aนี้ และval_Bเป็นชนิดค่าจํานวนเต็ม
int val_A = 2;
int val_B = val_A;
val_B = 5;
Console.WriteLine("--Value Types--");
Console.WriteLine($"val_A: {val_A}");
Console.WriteLine($"val_B: {val_B}");
คุณควรเห็นผลลัพธ์ต่อไปนี้:
--Value Types--
val_A: 2
val_B: 5
เมื่อval_B = val_Aดําเนินการ ค่าของ val_A จะถูกคัดลอกและจัดเก็บไว้ในval_B ดังนั้นเมื่อ val_B มีการเปลี่ยนแปลง val_A จะยังคงไม่ได้รับผลกระทบ
-
ชนิดการอ้างอิง (อาร์เรย์): ในตัวอย่าง
ref_Aนี้ และref_Bเป็นชนิดการอ้างอิงอาร์เรย์
int[] ref_A= new int[1];
ref_A[0] = 2;
int[] ref_B = ref_A;
ref_B[0] = 5;
Console.WriteLine("--Reference Types--");
Console.WriteLine($"ref_A[0]: {ref_A[0]}");
Console.WriteLine($"ref_B[0]: {ref_B[0]}");
คุณควรเห็นผลลัพธ์ต่อไปนี้:
--Reference Types--
ref_A[0]: 5
ref_B[0]: 5
เมื่อ ref_B = ref_A ดําเนินการ จะ ref_B ชี้ไปยังตําแหน่ง ref_Aหน่วยความจําเดียวกันกับ ดังนั้นเมื่อ ref_B[0] มีการเปลี่ยนแปลงจะเปลี่ยนแปลง ref_A[0] เนื่องจากทั้งสองจุดไปยังตําแหน่งหน่วยความจําเดียวกัน นี่คือความแตกต่างที่สําคัญระหว่างชนิดค่าและชนิดการอ้างอิง
สรุป
- ชนิดค่าสามารถเก็บค่าที่น้อยกว่าและจัดเก็บไว้ในกองซ้อน ชนิดการอ้างอิงสามารถเก็บค่าขนาดใหญ่ และอินสแตนซ์ใหม่ของชนิดการอ้างอิงจะถูกสร้างขึ้นโดยใช้ตัว
newดําเนินการ ตัวแปรชนิดการอ้างอิงเก็บการอ้างอิง (ที่อยู่หน่วยความจํา) ไปยังค่าจริงที่จัดเก็บไว้ในฮีพ - ชนิดการอ้างอิงรวมถึงอาร์เรย์ สตริง และคลาส
ตรวจสอบความรู้ของคุณ
คำติชม
หน้านี้มีประโยชน์หรือไม่
ไม่
ต้องการความช่วยเหลือในหัวข้อนี้หรือไม่
ต้องการลองใช้ Ask Learn เพื่อทําให้ชัดเจนหรือแนะนําคุณผ่านหัวข้อนี้หรือไม่