ป้องกันค่าว่าง
การตรวจสอบและรูปแบบ
ป้องกันค่าว่าง เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงต้องป้องกันค่าว่าง
เมธอดที่ได้รับ null โดยไม่คาดคิดมักจะขัดข้องในภายหลังด้วย NullReferenceException ที่ทำให้สับสนและอยู่ลึกในลำดับการเรียก
การป้องกันหมายถึงการตรวจสอบอาร์กิวเมนต์ตั้งแต่ต้นและหยุดทำงานอย่างชัดเจน เพื่อให้ข้อผิดพลาดชี้ตรงไปยังสาเหตุที่แท้จริง
การตรวจสอบค่าว่างแบบเดิม
วิธีป้องกันที่ง่ายที่สุดคือการตรวจสอบอย่างชัดแจ้ง แล้วโยน ArgumentNullException เมื่ออาร์กิวเมนต์ที่จำเป็นเป็น null
วิธีนี้ตรวจสอบข้อมูลขาเข้าที่ขอบเขตของเมธอด ก่อนเริ่มดำเนินการใด ๆ
void Save(string path)
{
if (path == null)
throw new System.ArgumentNullException(nameof(path));
System.Console.WriteLine(path);
}ใช้ชื่อพารามิเตอร์
ส่ง nameof(path) แทนสตริงที่เขียนตายตัว จากนั้นข้อผิดพลาดจะแจ้งชื่อพารามิเตอร์ที่ถูกต้อง และยังคงถูกต้องหากคุณเปลี่ยนชื่อพารามิเตอร์
วิธีนี้ทำให้การแก้ไขข้อบกพร่องทำได้ง่ายขึ้นมากเมื่อมีการบันทึกข้อผิดพลาด
void Greet(string user)
{
if (user is null)
throw new System.ArgumentNullException(nameof(user));
System.Console.WriteLine("Hi " + user);
}ตัวช่วย ThrowIfNull
C# สมัยใหม่มี ArgumentNullException.ThrowIfNull(arg) ซึ่งตรวจสอบค่าว่างและโยนข้อผิดพลาดพร้อมชื่อพารามิเตอร์ที่ถูกต้องโดยอัตโนมัติ
รูปแบบนี้กระชับและเป็นวิธีป้องกันที่แนะนำในโค้ด .NET ปัจจุบัน
void Process(object data)
{
System.ArgumentNullException.ThrowIfNull(data);
System.Console.WriteLine("Processing");
}ตัวอย่างการตรวจสอบป้องกันที่เรียกใช้ได้
โปรแกรมนี้แสดงการตรวจสอบป้องกันที่จับอาร์กิวเมนต์ที่เป็นค่าว่างและรายงานอย่างเรียบร้อย แทนที่จะปล่อยให้โปรแกรมขัดข้องในภายหลัง
โปรดเรียกใช้เพื่อดูข้อความข้อผิดพลาดที่ระบุชื่อพารามิเตอร์ที่ไม่ถูกต้อง
using System;
class Program
{
static void Print(string text)
{
ArgumentNullException.ThrowIfNull(text);
Console.WriteLine(text);
}
static void Main()
{
try { Print(null); }
catch (ArgumentNullException ex) { Console.WriteLine(ex.ParamName); }
}
}การตรวจสอบป้องกันด้วย ?? และการโยนข้อผิดพลาด
คุณสามารถกำหนดค่าและตรวจสอบไปพร้อมกันได้โดยใช้ ?? ร่วมกับ throw วิธีนี้ตรวจสอบและจัดเก็บค่าได้ในบรรทัดเดียว
รูปแบบนี้ได้รับความนิยมในตัวสร้าง เมื่อกำหนดค่าให้กับฟิลด์
class Service
{
private readonly string _name;
public Service(string name)
=> _name = name ?? throw new System.ArgumentNullException(nameof(name));
}ค่าว่างเปล่ากับค่า null
สำหรับสตริง ค่า null และค่าว่างเปล่าเป็นคนละปัญหากัน ใช้ string.IsNullOrEmpty หรือ string.IsNullOrWhiteSpace เพื่อจับทั้งสองกรณีได้พร้อมกัน
ควรใช้ ArgumentException ไม่ใช่ ArgumentNullException กับค่าที่ว่างเปล่าแต่ไม่ใช่ null
void SetName(string name)
{
if (string.IsNullOrWhiteSpace(name))
throw new System.ArgumentException("Name required", nameof(name));
}การป้องกันด้วยรูปแบบการตรวจสอบ
รูปแบบ is null และ is not null อ่านเข้าใจได้ชัดเจน และไม่สามารถถูกหลอกด้วยตัวดำเนินการเท่ากับที่เขียนทับได้
ควรใช้ is null แทน == null เมื่อชนิดข้อมูลอาจเขียนทับ ==
object value = null;
if (value is null)
System.Console.WriteLine("It is null");
if (value is not null)
System.Console.WriteLine("Has value");ใช้ค่าเริ่มต้นแทนการโยนข้อผิดพลาด
ค่าว่างไม่ได้เป็นข้อผิดพลาดเสมอไป บางครั้งการใช้ค่าเริ่มต้นที่เหมาะสมก็ดีกว่าการโยนข้อผิดพลาด
ใช้ ?? เมื่อยอมรับค่าว่างได้ และโยนข้อผิดพลาดเฉพาะเมื่อจำเป็นต้องมีค่านั้นจริง ๆ
string BuildPath(string folder)
{
folder ??= "/tmp";
return folder + "/file.txt";
}ชนิดอ้างอิงที่รับค่าว่างได้ช่วยได้
เมื่อเปิดใช้ชนิดอ้างอิงที่รับค่าว่างได้ คอมไพเลอร์จะแจ้งเตือนเมื่อคุณอาจเข้าถึงค่าที่อาจไม่มีค่า ซึ่งช่วยจับข้อบกพร่องก่อนการทำงานจริง
การประกาศ string ซึ่งไม่รับค่าว่าง เทียบกับ string? ซึ่งรับค่าว่างได้ จะบันทึกเจตนาของคุณและช่วยแนะนำเครื่องมือวิเคราะห์
#nullable enable
string required = "ok";
string? optional = null;
System.Console.WriteLine(optional?.Length ?? 0);ตรวจสอบก่อนแล้วจึงใช้อย่างปลอดภัย
เมื่อคุณตรวจสอบป้องกันไว้ที่ต้นเมธอดแล้ว ส่วนที่เหลือของเนื้อหาเมธอดก็สามารถใช้ค่าได้โดยไม่ต้องตรวจสอบค่าว่างซ้ำ
โปรแกรมนี้ตรวจสอบป้องกันก่อน แล้วจึงใช้อาร์กิวเมนต์ได้อย่างมั่นใจ
using System;
class Program
{
static int Length(string s)
{
ArgumentNullException.ThrowIfNull(s);
return s.Length;
}
static void Main()
{
Console.WriteLine(Length("hello"));
}
}ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจของคุณเกี่ยวกับการป้องกันค่าว่าง
สรุปทบทวน
ตรวจสอบอาร์กิวเมนต์ที่จำเป็นตั้งแต่ต้นเมธอด ใช้ ArgumentNullException.ThrowIfNull หรือ ?? throw ร่วมกับ nameof เพื่อให้ข้อผิดพลาดชัดเจน
ใช้ string.IsNullOrWhiteSpace สำหรับสตริงว่าง ใช้รูปแบบ is null เพื่อตรวจสอบอย่างปลอดภัย และใช้ ?? เมื่อยอมรับค่าเริ่มต้นได้แทนการทำงานล้มเหลว
เรียนรู้ C# ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 93
- บทเรียน
- 346
คำถามที่พบบ่อย
บทเรียน “ป้องกันค่าว่าง” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ป้องกันค่าว่าง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ