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

ตัวดำเนินการเงื่อนไข Null และรวมค่า Null

ใช้ ?., ?[], ?? และ ??= ร่วมกันเพื่อเขียนโค้ดที่ปลอดภัยจาก null ได้กระชับ โดยไม่ต้องตรวจสอบ null อย่างละเอียด

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

รูปแบบโค้ดที่ปลอดภัยจากค่าว่าง

C# มีตัวดำเนินการเฉพาะสามรายการสำหรับจัดการค่าค่าว่างอย่างกระชับ ได้แก่ ตัวดำเนินการตรวจสอบค่าว่างแบบมีเงื่อนไข (?., ?[]) ตัวดำเนินการรวมค่าทดแทนเมื่อเป็นค่าว่าง (??) และ การกำหนดค่าแบบรวมค่าทดแทนเมื่อเป็นค่าว่าง (??=) เมื่อใช้ร่วมกัน ตัวดำเนินการเหล่านี้ช่วยขจัดโค้ดตรวจสอบค่าว่างที่ยืดยาวส่วนใหญ่

ตัวดำเนินการตรวจสอบค่าว่างแบบมีเงื่อนไข: ?.

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

User? user = GetUser(id);

// Without ?.:
string? name = null;
if (user != null) name = user.Name;

// With ?.:
string? name2 = user?.Name;

// Chained:
string? city = user?.Address?.City;

// Method call:
string? upper = user?.Name?.ToUpper();

ตัวดำเนินการตรวจสอบค่าว่างแบบมีเงื่อนไขกับตัวเข้าถึงดัชนี: ?[]

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

List<string>? tags = product?.Tags;

// Safe index access
string? firstTag = tags?[0];

// Null-conditional LINQ
int? count = tags?.Count;
bool? hasItems = tags?.Any();

// With methods:
string? joined = tags?.FirstOrDefault()?.ToUpper();

ตัวดำเนินการรวมค่าทดแทนเมื่อเป็นค่าว่าง: ??

?? จะคืนค่าตัวถูกดำเนินการด้านซ้ายหากไม่เป็นค่าว่าง มิฉะนั้นจะคืนค่าตัวถูกดำเนินการด้านขวา (ค่าทดแทน) เป็นทางเลือกที่กระชับแทน x != null ? x : fallback

string? name = GetName();

// Without ??:
string display = name != null ? name : "Anonymous";

// With ??:
string display2 = name ?? "Anonymous";

// Chaining ?? for multiple fallbacks:
string result = primary ?? secondary ?? tertiary ?? "Default";

// Combining with ?.
string city = user?.Address?.City ?? "Unknown City";

การกำหนดค่าแบบรวม null: ??=

??= จะกำหนดค่าด้านขวาให้ตัวแปรก็ต่อเมื่อตัวแปรนั้นมีค่าเป็น null อยู่ในขณะนั้น เหมาะอย่างยิ่งสำหรับรูปแบบการเริ่มต้นแบบขี้เกียจ

// Lazy initialization
private List<string>? _cache;

public List<string> GetCache()
{
    _cache ??= new List<string>(); // only assigns if null
    return _cache;
}

// Equivalent to:
// if (_cache is null) _cache = new List<string>();

// In-place:
string? name = null;
name ??= "Default";
Console.WriteLine(name); // "Default"

การใช้ ?. กับเหตุการณ์

ตัวดำเนินการแบบมีเงื่อนไขเมื่อเป็น null เป็นวิธีมาตรฐานที่ปลอดภัยต่อเธรดสำหรับการเรียกใช้เหตุการณ์ โดยหลีกเลี่ยงภาวะการแข่งขันที่อาจเกิดจากการตรวจสอบ null และการเรียกใช้ที่แยกจากกัน

public event EventHandler<DataEventArgs>? DataReceived;

// Thread-safe event invocation:
DataReceived?.Invoke(this, new DataEventArgs(data));

// This is equivalent to:
var handler = DataReceived;
if (handler != null) handler(this, new DataEventArgs(data));
// (local copy avoids race condition between check and invoke)

ตัวอย่างการเชื่อมโยงที่ซับซ้อน

การผสมผสานตัวดำเนินการช่วยให้การนำทางผ่านกราฟออบเจ็กต์ที่ซ้อนกันหลายระดับโดยปลอดภัยจาก null มีรูปแบบที่สะอาดและอ่านเข้าใจง่าย

var order = GetOrder(id);

// Deeply nested with fallbacks:
string countryCode = order
    ?.Customer
    ?.ShippingAddress
    ?.Country
    ?.Code
    ?? "US";

// Collection safe access:
decimal firstLineTotal = order
    ?.Lines
    ?.FirstOrDefault()
    ?.Total
    ?? 0m;

// Method chain:
string? trackingUpper = order?.TrackingNumber?.ToUpper().Trim();

ตัวดำเนินการแบบมีเงื่อนไขเมื่อเป็น null ใน LINQ

ตัวดำเนินการแบบมีเงื่อนไขเมื่อเป็น null ทำงานร่วมกับ LINQ ได้อย่างราบรื่น ทำให้สามารถสอบถามคอลเลกชันหรือคุณสมบัติที่อาจมีค่าเป็น null ได้อย่างปลอดภัย

List<Order>? orders = customer?.Orders;

// Safe LINQ on a nullable collection:
var totalRevenue = orders?.Sum(o => o.Total) ?? 0m;
var pendingCount = orders?.Count(o => o.Status == OrderStatus.Pending) ?? 0;
var latest       = orders?.MaxBy(o => o.PlacedAt)?.Id;

การป้องกัน null ด้วย ThrowIfNull

สำหรับพารามิเตอร์ที่ต้องไม่เป็น null ให้ใช้ ArgumentNullException.ThrowIfNull() (.NET 6 ขึ้นไป) เพื่อการตรวจสอบที่กระชับและสื่อความหมายได้ชัดเจนตั้งแต่ต้นเมธอด

public void ProcessOrder(Order order, Customer customer)
{
    ArgumentNullException.ThrowIfNull(order);
    ArgumentNullException.ThrowIfNull(customer);

    // From this point, compiler knows both are non-null
    Console.WriteLine(order.Id);
    Console.WriteLine(customer.Name);
}

// .NET 7+: ArgumentException.ThrowIfNullOrEmpty
void Save(string name)
{
    ArgumentException.ThrowIfNullOrWhiteSpace(name);
    // name is guaranteed non-empty
}

รูปแบบ Is Not Null ใน Switch

การจับคู่รูปแบบด้วย is not null และ is { } ช่วยให้เขียนรูปแบบการตรวจสอบ null ได้อย่างสะอาด โดยเฉพาะในนิพจน์ switch

string Describe(object? obj) => obj switch
{
    null                          => "nothing",
    string s when s.Length == 0  => "empty string",
    string s                      => $"string: {s}",
    int i                         => $"integer: {i}",
    { }                           => $"object: {obj.GetType().Name}"
};

// is not null in if statements:
if (order is not null && order.Customer is { Name: var name })
    Console.WriteLine(name);

การตรวจสอบอย่างรวดเร็ว

นิพจน์ user?.Name ?? "Anonymous" จะส่งคืนอะไรเมื่อ user เป็น null

สรุป: ตัวดำเนินการแบบมีเงื่อนไขเมื่อเป็น null และการรวมค่า null

ประเด็นสำคัญ:

  • ?.: การเข้าถึงสมาชิกอย่างปลอดภัย จะส่งคืน null แทนการโยนข้อผิดพลาดเมื่อออบเจ็กต์ที่เป็นตัวรับมีค่าเป็น null
  • ?[]: การเข้าถึงดัชนีอย่างปลอดภัยสำหรับคอลเลกชันที่อาจมีค่าเป็น null
  • ??: ค่าสำรองเมื่อโอเปอแรนด์ด้านซ้ายมีค่าเป็น null
  • ??=: กำหนดค่าเฉพาะเมื่อเป็น null เหมาะอย่างยิ่งสำหรับการเริ่มต้นแบบขี้เกียจ
  • เชื่อมโยงเข้าด้วยกัน: a?.B?.C ?? defaultVal เพื่อการนำทางเชิงลึกที่ปลอดภัยจาก null
  • ArgumentNullException.ThrowIfNull() สำหรับการตรวจสอบพารามิเตอร์

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

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

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

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

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

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

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

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

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

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

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

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

  1. การเปิดใช้และทำความเข้าใจ NRT
  2. คำอธิบายประกอบ: ?, !, MaybeNull และ NotNull
  3. ตัวดำเนินการเงื่อนไข Null และรวมค่า Null
  4. การย้ายโค้ดเบสไปยัง NRT
← กลับไปที่ C# Academy