แบบฝึกหัด - บล็อกโค้ดและขอบเขตตัวแปร
- 11 นาที
บล็อกรหัสคือคําสั่ง C# อย่างน้อยหนึ่งคําสั่งที่กําหนดเส้นทางการดําเนินการ คําสั่งภายนอกของบล็อกรหัสจะส่งผลกระทบเมื่อ ถ้า และความถี่ที่บล็อกของโค้ดถูกดําเนินการในเวลาที่เรียกใช้ ขอบเขตของบล็อกโค้ดมักกําหนดด้วยวงเล็บปีก {}กา
นอกเหนือจากผลกระทบต่อเส้นทางการดําเนินการบล็อกโค้ดยังสามารถส่งผลกระทบต่อขอบเขตของตัวแปรของคุณได้ ตัวอย่างรหัสที่คุณตรวจสอบในระหว่างแบบฝึกหัดนี้จะช่วยให้คุณเข้าใจความสัมพันธ์ระหว่างบล็อกโค้ดและขอบเขตตัวแปร
บล็อกโค้ดส่งผลกระทบต่อขอบเขตของการประกาศตัวแปร
ขอบเขตตัวแปรอ้างอิงถึงการมองเห็นของตัวแปรไปยังโค้ดอื่น ๆ ในแอปพลิเคชันของคุณ ตัวแปรที่กําหนดขอบเขตภายในเครื่องสามารถเข้าถึงได้เฉพาะภายในบล็อกโค้ดที่กําหนดไว้เท่านั้น หากคุณพยายามเข้าถึงตัวแปรภายนอกบล็อกโค้ด คุณจะได้รับข้อผิดพลาดของคอมไพเลอร์
ส่วนที่เหลือของหน่วยนี้สํารวจความสัมพันธ์ระหว่างบล็อกโค้ดและขอบเขตตัวแปร
เตรียมสภาพแวดล้อมการเข้ารหัสของคุณ
โมดูลนี้ประกอบด้วยกิจกรรมลงมือทําซึ่งจะแนะนําคุณตลอดกระบวนการสร้างและเรียกใช้รหัสการสาธิต คุณควรทํากิจกรรมเหล่านี้ให้เสร็จสมบูรณ์โดยใช้ Visual Studio Code เป็นสภาพแวดล้อมการพัฒนาของคุณ การใช้ Visual Studio Code สําหรับกิจกรรมเหล่านี้จะช่วยให้คุณเขียนและเรียกใช้โค้ดในสภาพแวดล้อมของนักพัฒนาที่มืออาชีพใช้ทั่วโลกได้อย่างสะดวกขึ้น
เปิด Visual Studio Code
คุณสามารถใช้เมนูเริ่มต้นของ Windows (หรือทรัพยากรที่เทียบเท่าสําหรับระบบปฏิบัติการอื่น) เพื่อเปิด Visual Studio Code
บนเมนู ไฟล์ รหัส Visual Studio เลือก เปิดโฟลเดอร์
ในกล่องโต้ตอบ เปิดโฟลเดอร์ ให้ไปยังโฟลเดอร์ Windows Desktop
หากคุณมีตําแหน่งโฟลเดอร์อื่นที่คุณเก็บโครงการโค้ดไว้ คุณสามารถใช้ตําแหน่งโฟลเดอร์นั้นแทนได้ สําหรับการฝึกนี้ สิ่งสําคัญคือการมีตําแหน่งที่ตั้งที่ง่ายต่อการค้นหาและจดจํา
ในกล่องโต้ตอบ เปิด โฟลเดอร์ ให้เลือก เลือกโฟลเดอร์
ถ้าคุณเห็นกล่องโต้ตอบความปลอดภัยที่ถามว่าคุณเชื่อถือผู้เขียนหรือไม่ ให้เลือก ใช่
บนเมนู เทอร์มินัล Visual Studio Code ให้เลือก เทอร์มินัลใหม่
โปรดสังเกตว่าพร้อมท์คําสั่งในแผงเทอร์มินัล จะแสดงเส้นทางโฟลเดอร์สําหรับโฟลเดอร์ปัจจุบัน เช่น:
C:\Users\someuser\Desktop>หมายเหตุ
ถ้าคุณกําลังทํางานบนพีซีของคุณเองแทนที่จะเป็น Sandbox หรือสภาพแวดล้อมที่เป็นโฮสต์ และคุณจบมอดูล Microsoft Learn อื่นๆ ใน C# ซีรี่ส์นี้ คุณอาจสร้างโฟลเดอร์โครงการสําหรับตัวอย่างโค้ดไว้แล้ว ถ้าเป็นกรณีนี้ คุณสามารถข้ามขั้นตอนถัดไป ซึ่งใช้เพื่อสร้างแอปคอนโซลในโฟลเดอร์ TestProject
ที่พรอมต์คําสั่งเทอร์มินัล หากต้องการสร้างแอปพลิเคชันคอนโซลใหม่ในโฟลเดอร์ที่ระบุ ให้ป้อนพร้อมท์ต่อไปนี้:
dotnet new console -o ./CsharpProjects/TestProjectคําสั่ง .NET CLI นี้ใช้เทมเพลตโปรแกรม .NET เพื่อสร้างโครงการแอปพลิเคชันคอนโซล C# ใหม่ในตําแหน่งที่ตั้งโฟลเดอร์ที่ระบุ คําสั่งจะสร้างโฟลเดอร์ CsharpProjects และ TestProject ให้คุณ และใช้ TestProject เป็นชื่อของไฟล์ของคุณ
.csprojถ้ามีข้อความแสดงขึ้นเพื่อบอกให้คุณทราบว่ามีไฟล์อยู่แล้ว ให้ทําตามขั้นตอนถัดไป คุณจะใช้ไฟล์โครงการที่มีอยู่อีกครั้ง
ในมุมมอง EXPLORER ให้ขยายโฟลเดอร์ CsharpProjects
คุณควรเห็นโฟลเดอร์ TestProject และแฟ้มสองแฟ้ม แฟ้มโปรแกรม C# ที่ชื่อว่า Program.cs และแฟ้มโครงการ C# ที่ชื่อ TestProject.csproj
บนเมนู ไฟล์ รหัส Visual Studio เลือก เปิดโฟลเดอร์
ในกล่องโต้ตอบ เปิดโฟลเดอร์ เลือกโฟลเดอร์ CsharpProjects จากนั้นเลือก เลือกโฟลเดอร์
ในมุมมอง EXPLORER ให้ขยายโฟลเดอร์ TestProject จากนั้นเลือก Program.cs
ลบบรรทัดรหัสที่มีอยู่
คุณจะใช้โครงการคอนโซล C# นี้เพื่อสร้าง สร้าง และเรียกใช้ตัวอย่างโค้ดในระหว่างโมดูลนี้
ปิดแผงเทอร์มินัล
สร้างตัวแปรภายในบล็อกรหัส
คุณจะเริ่มต้นโดยดูที่กรณีเมื่อมีการเตรียมใช้งานตัวแปรภายในบล็อกรหัส
ตรวจสอบให้แน่ใจว่าคุณมี Visual Studio Code เปิดและ Program.cs แสดงในแผง ตัวแก้ไข
หมายเหตุ
Program.cs ควรว่างเปล่า ถ้าไม่ใช่ เลือกและลบบรรทัดรหัสทั้งหมด
พิมพ์โค้ดต่อไปนี้ลงใน Visual Studio Code Editor:
bool flag = true; if (flag) { int value = 10; Console.WriteLine($"Inside the code block: {value}"); }บนเมนู ไฟล์ของ Visual Studio Code เลือก บันทึก
ต้องบันทึกไฟล์ Program.cs ก่อนที่จะสร้างหรือเรียกใช้โค้ด
ในแผง EXPLORER หากต้องการเปิดเทอร์มินัลที่ตําแหน่งโฟลเดอร์ TestProject ของคุณ ให้คลิกขวาที่ TestProject จากนั้นเลือก เปิดในเทอร์มินัลแบบรวม
แผงเทอร์มินัลจะเปิดขึ้น เทอร์มินัลควรมีพร้อมท์คําสั่งที่แสดงว่าเทอร์มินัลเปิดอยู่ไปยังตําแหน่งที่ตั้งโฟลเดอร์ TestProject ของคุณ
ที่พร้อมท์คําสั่งเทอร์มินัล เพื่อเรียกใช้โค้ดของคุณ ให้พิมพ์ dotnet run แล้วกด Enter
หมายเหตุ
ถ้าคุณเห็นข้อความ "ไม่พบโครงการที่จะเรียกใช้" ตรวจสอบให้แน่ใจว่าพร้อมท์คําสั่งเทอร์มินัลแสดงตําแหน่งที่ตั้งโฟลเดอร์ TestProject ที่คาดไว้ ตัวอย่าง:
C:\Users\someuser\Desktop\csharpprojects\TestProject>คุณควรเห็นผลลัพธ์ต่อไปนี้:
Inside the code block: 10
นี่คือเอาต์พุตที่คาดหวังไว้ แต่จะเกิดอะไรขึ้นถ้าคุณต้องการเข้าถึงตัวแปร value ภายนอก if บล็อกรหัสคําสั่ง
พยายามเข้าถึงตัวแปรภายนอกบล็อกรหัสที่มีการประกาศ
ในตัวแก้ไขรหัส Visual Studio ให้สร้างบรรทัดโค้ดใหม่ด้านล่างบล็อก
ifรหัสคําสั่งบนบรรทัดโค้ดว่างที่คุณสร้างขึ้น ให้เพิ่มบรรทัดโค้ดต่อไปนี้:
Console.WriteLine($"Outside the code block: {value}");ตรวจสอบว่ารหัสที่อัปเดตแล้วของคุณมีลักษณะดังต่อไปนี้:
bool flag = true; if (flag) { int value = 10; Console.WriteLine($"Inside the code block: {value}"); } Console.WriteLine($"Outside the code block: {value}");บันทึกไฟล์โค้ดของคุณ จากนั้นใช้ Visual Studio Code เพื่อเรียกใช้โค้ดของคุณ
ใส่
dotnet runจากพร้อมท์คําสั่งเทอร์มินัล เพื่อเรียกใช้โค้ดของคุณโปรดสังเกตว่า เมื่อคุณพยายามเรียกใช้แอปพลิเคชัน คุณได้รับข้อผิดพลาดในการคอมไพล์:
Program.cs(7,46): error CS0103: The name 'value' does not exist in the current context
ส่วน Program.cs(7,46) หนึ่งของข้อความแจ้งให้คุณทราบว่าข้อผิดพลาดเกี่ยวข้องกับบรรทัดที่ 7 ในไฟล์ Program.cs คอลัมน์ 46
ข้อผิดพลาดนี้ถูกสร้างขึ้นเนื่องจากตัวแปรที่ประกาศภายในบล็อกรหัสสามารถเข้าถึงได้เท่านั้น (สามารถดูได้) ภายในบล็อกรหัสนั้น เนื่องจากไม่สามารถเข้าถึงตัวแปรภายนอกบล็อกรหัสที่มีการ value ประกาศไม่สามารถเข้าถึงได้จากบรรทัดที่ 7 ของโค้ดของคุณ
ตัวแปรที่ถูกประกาศในบล็อกรหัสเมธอดจะเรียกว่าตัวแปรภายในเครื่อง คุณอาจเห็นคําว่า ตัวแปรภายในเครื่อง ที่ใช้เมื่อตรวจทานบทความที่กล่าวถึงขอบเขตตัวแปร
ย้ายการประกาศตัวแปรไปเหนือบล็อกรหัส
หากต้องการเข้าถึงตัวแปรทั้งภายในและภายนอกบล็อกรหัส คุณจะต้องประกาศตัวแปรก่อน (ด้านบน) บล็อกรหัสเพื่อให้รหัสภายนอกบล็อกโค้ดสามารถ "ดู" ตัวแปรได้
อัปเดตโค้ดของคุณใน Visual Studio Code Editor ดังนี้:
bool flag = true; int value; if (flag) { Console.WriteLine($"Inside the code block: {value}"); } value = 10; Console.WriteLine($"Outside the code block: {value}");ใช้เวลาสักครู่เพื่อตรวจสอบการอัปเดต
โปรดสังเกตว่า
valueขณะนี้ถูกประกาศ (แต่ไม่มีการเตรียมใช้งาน) ภายนอกifบล็อกรหัสใช้รหัส Visual Studio เพื่อบันทึกการอัปเดตและเรียกใช้โค้ดของคุณ
โปรดสังเกตว่าคุณยังคงได้รับข้อผิดพลาดในการคอมไพล์
ในครั้งนี้ เมื่อคุณพยายามเรียกใช้แอปพลิเคชัน คุณจะได้รับข้อผิดพลาดในการคอมไพล์ต่อไปนี้:
Program.cs(6,49): error CS0165: Use of unassigned local variable 'value'ข้อผิดพลาดเกี่ยวข้องกับบรรทัดที่ 6 ภายในบล็อกโค้ดเนื่องจาก
valueไม่ได้กําหนดค่าเริ่มต้น (ไม่ได้กําหนดค่า) หากบรรทัดvalue = 10;รหัสอยู่เหนือifบล็อกรหัสคําสั่ง แอปพลิเคชันจะคอมไพล์อย่างถูกต้องและทุกอย่างจะสามารถทําได้ อย่างไรก็ตาม เนื่องจากvalueยังไม่ถูกเตรียมใช้งาน จึงไม่สามารถเข้าถึงภายในบล็อกโค้ดได้ตรวจสอบให้แน่ใจว่ามีการเตรียมใช้งานตัวแปรของคุณก่อนที่จะพยายามเข้าถึงตัวแปรเหล่านั้นจะแก้ไขปัญหานี้
เตรียมใช้งานตัวแปรเป็นส่วนหนึ่งของการประกาศตัวแปร
หากต้องการเริ่มต้น
valueเป็นส่วนหนึ่งของการประกาศตัวแปร ให้อัปเดตโค้ดของคุณดังนี้:bool flag = true; int value = 0; if (flag) { Console.WriteLine($"Inside the code block: {value}"); } value = 10; Console.WriteLine($"Outside the code block: {value}");รหัสนี้เน้นข้อผิดพลาดการคอมไพล์ "ตัวแปรภายในเครื่องที่ไม่ได้กําหนด" โดยการเตรียมใช้งาน
valueเป็นส่วนหนึ่งของการประกาศตัวแปรของคุณใช้รหัส Visual Studio เพื่อบันทึกและเรียกใช้โค้ดของคุณ
โปรดสังเกตว่า ในตอนนี้ เมื่อคุณเรียกใช้แอปพลิเคชัน คุณเห็นผลลัพธ์ต่อไปนี้:
Inside the code block: 0 Outside the code block: 10
ตรวจสอบการตีความโค้ดของคุณโดยคอมไพเลอร์
เพื่อช่วยให้คุณหลีกเลี่ยงข้อผิดพลาดรันไทม์ คอมไพเลอร์ C# จะวิเคราะห์โค้ดของคุณใน Visual Studio Code Editor และในระหว่างกระบวนการสร้าง อย่างไรก็ตามคอมไพเลอร์อาจไม่แปลโค้ดของคุณในลักษณะเดียวกับที่คุณทําเสมอไป
พิจารณาตัวอย่างโค้ดสองตัวอย่างต่อไปนี้ที่ปรากฏเพื่อทําหน้าที่ในวัตถุประสงค์เดียวกัน:
// Code sample 1
bool flag = true;
int value;
if (flag)
{
value = 10;
Console.WriteLine($"Inside the code block: {value}");
}
Console.WriteLine($"Outside the code block: {value}");
// Code sample 2
int value;
if (true)
{
value = 10;
Console.WriteLine($"Inside the code block: {value}");
}
Console.WriteLine($"Outside the code block: {value}");
คุณอาจรู้สึกว่าตัวอย่างสองตัวอย่างนี้ควรให้ผลลัพธ์เดียวกันเสมอ แต่คอมไพเลอร์ C# จะแปลตัวอย่างโค้ดสองตัวอย่างนี้แตกต่างกัน
สําหรับตัวอย่างโค้ดแรก คอมไพเลอร์จะแปลflagเป็นตัวแปรบูลีนที่สามารถกําหนดค่าเป็น หรือ trueได้false คอมไพเลอร์สรุปว่าหาก flag เป็น falsevalue จะไม่มีการเตรียมใช้งานเมื่อดําเนินการวินาทีConsole.WriteLine() คอมไพเลอร์จะพิจารณาเส้นทางการดําเนินการโค้ดสองเส้นทางต่อไปนี้:
// path when flag = true
int value;
value = 10;
Console.WriteLine($"Inside the code block: {value}");
Console.WriteLine($"Outside the code block: {value}");
และ
// path when flag = false
int value;
Console.WriteLine($"Outside the code block: {value}");
เนื่องจากคอมไพเลอร์พิจารณาเส้นทางที่สองที่ความเป็นไปได้ (สําหรับตัวอย่างรหัส 1) จึงสร้างข้อความแสดงข้อผิดพลาดในระหว่างกระบวนการสร้าง นอกจากนี้ ตัวแก้ไขโค้ดใน Visual Studio Code จะแจ้งเตือนคุณเกี่ยวกับปัญหานี้โดยการแสดงเส้นหยักสีแดงภายใต้ value (ด้านล่างของบล็อกโค้ด)
สําหรับตัวอย่างรหัสที่สอง ตัวประกอบจะสรุปว่าเนื้อหาของ if บล็อกรหัสคําสั่งจะดําเนินการเสมอ (true คือเสมอ true) คอมไพเลอร์ไม่ได้สร้างข้อผิดพลาดในการสร้าง เนื่องจากจะแปลตัวอย่างโค้ดที่สองให้มีเส้นทางการดําเนินการเดียวดังนี้:
int value;
value = 10;
Console.WriteLine($"Inside the code block: {value}");
Console.WriteLine($"Outside the code block: {value}");
สรุป
นี่คือสิ่งสําคัญบางอย่างที่ต้องจําเกี่ยวกับบล็อกโค้ด:
- เมื่อคุณประกาศตัวแปรภายในบล็อกรหัส การมองเห็นจะอยู่ภายในบล็อกรหัสนั้น และตัวแปรนั้นจะไม่สามารถเข้าถึงภายนอกบล็อกรหัสได้
- เพื่อให้แน่ใจว่าตัวแปรสามารถมองเห็นได้ทั้งภายในและภายนอกของบล็อกรหัส คุณต้องประกาศตัวแปรก่อนบล็อกรหัส (ภายนอกและด้านบนบล็อกโค้ด)
- ตรวจสอบให้แน่ใจว่ามีการเตรียมใช้งานตัวแปรก่อนที่จะพยายามเข้าถึงโค้ดของคุณ (สําหรับเส้นทางการดําเนินการโค้ดที่เป็นไปได้ทั้งหมด)
ตรวจสอบความรู้ของคุณ
คำติชม
หน้านี้มีประโยชน์หรือไม่
ไม่
ต้องการความช่วยเหลือในหัวข้อนี้หรือไม่
ต้องการลองใช้ Ask Learn เพื่อทําให้ชัดเจนหรือแนะนําคุณผ่านหัวข้อนี้หรือไม่