0Pricing
C# Academy · บทเรียน

ตัวดำเนินการเงื่อนไขค่าว่าง

เข้าถึงอย่างปลอดภัยด้วย ?.

ตัวดำเนินการเงื่อนไขค่าว่าง เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

ปัญหาของสายโซ่ค่าว่าง

การเข้าถึงสมาชิกของการอ้างอิงที่เป็น null จะทำให้เกิด NullReferenceException นี่เป็นหนึ่งในข้อขัดข้องขณะทำงานที่พบบ่อยที่สุดใน C#

เมื่อคุณเชื่อมการเรียกใช้อย่าง user.Address.City ลิงก์ใด ๆ ในสายโซ่อาจไม่มีค่า และวิธีแก้แบบเดิมคือเขียนเงื่อนไขตรวจสอบซ้อนกันหลายชั้น

ทำความรู้จักกับ ?.

ตัวดำเนินการแบบมีเงื่อนไขค่าว่าง ?. จะหยุดประเมินนิพจน์ที่เหลือทั้งหมด หากด้านซ้ายเป็น null ผลลัพธ์จะเป็น null แทนที่จะเกิดข้อผิดพลาด

อ่านความหมายได้ว่า “เข้าถึงสมาชิกนี้ แต่ทำเมื่อออบเจ็กต์ไม่เป็น null เท่านั้น”

string name = null;
int? length = name?.Length;
System.Console.WriteLine(length == null);

ผลลัพธ์จะรับค่าว่างได้

เนื่องจาก ?. อาจให้ผลลัพธ์เป็น null ชนิดของผลลัพธ์จึงรับค่าว่างได้ name?.Length มีชนิดเป็น int? ไม่ใช่ int

ด้วยเหตุนี้ คุณจึงต้องเก็บผลลัพธ์ไว้ใน int? แทนที่จะใช้ int ปกติ

string text = "hello";
int? len = text?.Length;
System.Console.WriteLine(len);

ตัวอย่างที่เรียกใช้ได้

โปรแกรมนี้แสดงให้เห็นว่า ?. จะคืนค่าเมื่อมีออบเจ็กต์อยู่ และคืนค่า null เมื่อไม่มีออบเจ็กต์

โปรดเรียกใช้โปรแกรมและสังเกตว่าจะไม่มีข้อผิดพลาดเกิดขึ้นเลย

using System;

class Program
{
    static void Main()
    {
        string a = "world";
        string b = null;
        Console.WriteLine(a?.ToUpper());
        Console.WriteLine(b?.ToUpper() ?? "(null)");
    }
}

การเชื่อมต่อ ?. หลายตัว

คุณสามารถเชื่อมต่อ ?. ผ่านสมาชิกหลายตัวได้ ทันทีที่ส่วนใดส่วนหนึ่งเป็น null สายโซ่ทั้งหมดจะหยุดและคืนค่า null

ดังนั้น customer?.Order?.Total จึงปลอดภัย แม้ว่า customer หรือ Order จะเป็น null

string s = null;
int? upperLen = s?.ToUpper()?.Length;
System.Console.WriteLine(upperLen == null);

ตัวเข้าถึงดัชนีแบบมีเงื่อนไขค่าว่าง ?[]

มีรูปแบบตัวเข้าถึงดัชนีอย่าง ?[] สำหรับอาร์เรย์และรายการ หากชุดข้อมูลเป็น null การเข้าถึงดัชนีจะคืนค่า null แทนที่จะทำให้โปรแกรมขัดข้อง

โปรดสังเกตว่าเครื่องมือนี้ป้องกันกรณีที่ชุดข้อมูลเป็น null ไม่ได้ป้องกันดัชนีที่อยู่นอกช่วง

int[] data = null;
int? first = data?[0];
System.Console.WriteLine(first == null);

การเรียกใช้เมธอดอย่างปลอดภัย

?. ยังช่วยป้องกันการเรียกใช้เมธอดด้วย list?.Clear() จะเรียกใช้ Clear เฉพาะเมื่อ list ไม่เป็น null มิฉะนั้นจะไม่ทำอะไร

สำหรับเมธอดที่คืนค่าเป็น void คำสั่งทั้งหมดจะไม่ทำอะไรเมื่อค่าเป็น null

System.Collections.Generic.List<int> list = null;
list?.Add(5);
System.Console.WriteLine("No crash");

การส่งเหตุการณ์อย่างปลอดภัยต่อเธรด

การใช้งานที่พบได้บ่อยคือการส่งเหตุการณ์ SomeEvent?.Invoke(this, args) จะส่งเหตุการณ์อย่างปลอดภัยเฉพาะเมื่อมีตัวจัดการอย่างน้อยหนึ่งตัวสมัครรับเหตุการณ์อยู่

รูปแบบนี้มาแทนที่รูปแบบตรวจสอบค่าว่างแบบเดิม ซึ่งอาจเกิดสภาวะแข่งขันระหว่างการตรวจสอบกับการเรียกใช้

System.Action handler = null;
handler?.Invoke();
System.Console.WriteLine("Invoked safely");

การใช้ร่วมกับ ??

?. ทำงานร่วมกับตัวดำเนินการเลือกค่าแทนเมื่อเป็นค่าว่าง ?? ได้อย่างเป็นธรรมชาติ เพื่อจัดหาค่าแทนเมื่อสายโซ่ไม่มีค่า

name?.Length ?? 0 จะให้ความยาว หรือให้ค่า 0 หาก name เป็น null

string name = null;
int length = name?.Length ?? 0;
System.Console.WriteLine(length);

จุดที่ต้องระวัง

แม้ว่าชนิดค่าสุดท้ายจะไม่รับค่าว่าง การใช้ ?. ก็ทำให้นิพจน์รับค่าว่างได้ list?.Count มีชนิดเป็น int? ไม่ใช่ int

หากคุณต้องการ int ปกติ ให้ต่อท้ายด้วย ?? 0 หรือใช้ GetValueOrDefault()

var list = new System.Collections.Generic.List<int> { 1, 2 };
int count = list?.Count ?? 0;
System.Console.WriteLine(count);

การเปรียบเทียบแบบเต็ม

โปรแกรมนี้เปรียบเทียบวิธีใช้เงื่อนไข if แบบยืดยาวกับวิธีใช้ ?. ที่กระชับ ทั้งสองวิธีหลีกเลี่ยงข้อผิดพลาดได้ แต่ ?. อ่านง่ายกว่ามาก

using System;

class Program
{
    static void Main()
    {
        string s = null;
        int len = s != null ? s.Length : -1;
        Console.WriteLine(len);
        Console.WriteLine(s?.Length ?? -1);
    }
}

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจของคุณเกี่ยวกับตัวดำเนินการแบบมีเงื่อนไขค่าว่าง

สรุปทบทวน

ตัวดำเนินการแบบมีเงื่อนไขค่าว่าง ?. และตัวเข้าถึงดัชนี ?[] จะหยุดการเข้าถึงสมาชิกเมื่อออบเจ็กต์เป็น null และคืนค่า null แทนการโยนข้อผิดพลาด

ผลลัพธ์จะรับค่าว่างได้ ดังนั้นให้ใช้ร่วมกับ ?? เพื่อจัดหาค่าแทน

คำถามที่พบบ่อย

บทเรียน “ตัวดำเนินการเงื่อนไขค่าว่าง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ตัวดำเนินการเงื่อนไขค่าว่าง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ตัวดำเนินการเงื่อนไขค่าว่าง”

เข้าถึงอย่างปลอดภัยด้วย ?. คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “ตัวดำเนินการเงื่อนไขค่าว่าง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม

ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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