C# Academy · บทเรียน

ป้องกันค่าว่าง

การตรวจสอบและรูปแบบ

บทเรียน 4 จาก 413 ขั้นตอน

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

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

  1. ชนิดค่าที่อาจเป็นค่าว่าง
  2. ตัวดำเนินการเงื่อนไขค่าว่าง
  3. ตัวดำเนินการรวมค่าว่าง
  4. ป้องกันค่าว่าง
← กลับไปที่ C# Academy