ตัวดำเนินการเงื่อนไข 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การเปิดใช้และทำความเข้าใจ NRT
- คำอธิบายประกอบ: ?, !, MaybeNull และ NotNull
- ตัวดำเนินการเงื่อนไข Null และรวมค่า Null
- การย้ายโค้ดเบสไปยัง NRT