ตัวดำเนินการรวมค่าว่าง
ค่าเริ่มต้นด้วย ?? และ ??=
ตัวดำเนินการรวมค่าว่าง เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
การจัดหาค่าแทน
บ่อยครั้งคุณต้องการใช้ค่าหากมีค่าอยู่ หรือใช้ค่าเริ่มต้นหากเป็น null ตัวดำเนินการเลือกค่าแทนเมื่อเป็นค่าว่าง ?? ทำหน้าที่นี้โดยตรง
a ?? b หมายถึง ใช้ a หากไม่เป็น null มิฉะนั้นให้ใช้ b
string input = null;
string name = input ?? "Guest";
System.Console.WriteLine(name);วิธีประเมินค่า ??
ระบบจะประเมินค่าด้านซ้ายก่อน หากด้านซ้ายไม่เป็น null ระบบจะไม่ประเมินค่าด้านขวาเลย
การหยุดประเมินแบบนี้ทำให้ค่าแทนที่ใช้ทรัพยากรมากถูกคำนวณเฉพาะเมื่อจำเป็นจริง ๆ
string cached = "data";
string value = cached ?? Compute();
System.Console.WriteLine(value);
// Compute() is never called hereทำงานร่วมกับชนิดค่าที่รับค่าว่างได้
?? ยังนำค่าจริงออกจากชนิดค่าที่รับค่าว่างได้ด้วย int? maybe เมื่อใช้ร่วมกับ ?? 0 จะได้ int ปกติที่ไม่รับค่าว่าง
นี่เป็นวิธีที่อ่านง่ายในการแปลงจาก int? เป็น int โดยมีค่าเริ่มต้น
int? maybe = null;
int sure = maybe ?? 0;
System.Console.WriteLine(sure);ตัวอย่างที่เรียกใช้ได้
โปรแกรมนี้อ่านการตั้งค่าที่อาจเป็นค่าว่าง และใช้ค่าเริ่มต้นแทน โปรดเรียกใช้เพื่อดูการทำงานของค่าแทน
using System;
class Program
{
static void Main()
{
string theme = null;
string active = theme ?? "light";
Console.WriteLine("Theme: " + active);
}
}การเชื่อมต่อ ??
คุณสามารถเชื่อมต่อค่าแทนหลายค่าได้ นิพจน์จะเลือกค่าตัวแรกจากซ้ายไปขวาที่ไม่เป็น null
a ?? b ?? c จะลองใช้ a จากนั้น b และสุดท้ายใช้ c เป็นทางเลือกสุดท้าย
string a = null;
string b = null;
string c = "default";
System.Console.WriteLine(a ?? b ?? c);ตัวดำเนินการ ??=
การกำหนดค่าแบบเลือกค่าแทนเมื่อเป็นค่าว่าง ??= จะกำหนดค่าด้านขวาเฉพาะเมื่อด้านซ้ายเป็น null ในขณะนั้น
x ??= y เป็นรูปย่อของ if (x == null) x = y; และจะคงค่า x เดิมไว้เมื่อมีค่าอยู่แล้ว
string config = null;
config ??= "default";
System.Console.WriteLine(config);
config ??= "ignored";
System.Console.WriteLine(config);การเริ่มต้นเมื่อจำเป็นด้วย ??=
การใช้งานทั่วไปของ ??= คือการเริ่มต้นเมื่อจำเป็น โดยสร้างออบเจ็กต์เฉพาะครั้งแรกที่ต้องใช้
ในการเรียกใช้ครั้งต่อ ๆ ไป ฟิลด์จะถูกกำหนดค่าไว้แล้ว ดังนั้น ??= จึงไม่ทำอะไร
System.Collections.Generic.List<int> items = null;
items ??= new System.Collections.Generic.List<int>();
items.Add(1);
System.Console.WriteLine(items.Count);การใช้ ?. และ ?? ร่วมกัน
การจับคู่ ?. กับ ?? เป็นรูปแบบที่ใช้กันมาก ?. จะช่วยหลีกเลี่ยงข้อผิดพลาด และ ?? จะจัดหาค่าเมื่อสายโซ่าไม่มีค่า
user?.Name ?? "Unknown" จะอ่านชื่ออย่างปลอดภัย และใช้ "Unknown" เป็นค่าเริ่มต้น
string s = null;
int length = s?.Length ?? -1;
System.Console.WriteLine(length);?? ในโปรแกรมเต็มรูปแบบ
ในที่นี้ทั้ง ?. และ ?? ทำงานร่วมกันเพื่อพิมพ์ความยาวอย่างปลอดภัย โปรดเรียกใช้ด้วยสตริงที่เป็นค่าว่างเพื่อดูค่าแทน
using System;
class Program
{
static void Main()
{
string username = null;
string display = username ?? "anonymous";
Console.WriteLine(display);
Console.WriteLine(username?.Length ?? 0);
}
}?? กับการโยนข้อผิดพลาดเมื่อเป็นค่าว่าง
ด้านขวาของ ?? อาจเป็นนิพจน์ใด ๆ รวมถึง throw ด้วย ทำให้ ?? เป็นวิธีกระชับในการหยุดทำงานทันทีเมื่อพบค่าว่างที่ไม่คาดคิด
name ?? throw new ArgumentNullException(nameof(name)) จะคืนค่า name หรือโยนข้อผิดพลาดหากเป็น null
string Validate(string name) =>
name ?? throw new System.ArgumentNullException(nameof(name));พฤติกรรมการเชื่อมโยงจากขวา
?? เชื่อมโยงจากขวา ดังนั้น a ?? b ?? c จะจัดกลุ่มเป็น a ?? (b ?? c)
ในทางปฏิบัติยังคงหมายความว่า “เลือกค่าที่ไม่เป็น null ตัวแรก” แต่การทราบเรื่องนี้มีประโยชน์เมื่อวิเคราะห์นิพจน์ที่ซับซ้อน
int? a = null;
int? b = null;
int result = a ?? b ?? 99;
System.Console.WriteLine(result);ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจของคุณเกี่ยวกับตัวดำเนินการเลือกค่าแทนเมื่อเป็นค่าว่าง
สรุปทบทวน
?? จะคืนค่าด้านซ้ายเมื่อไม่เป็น null มิฉะนั้นจะคืนค่าด้านขวา และสามารถเชื่อมต่อกันได้ ส่วน ??= จะกำหนดค่าเฉพาะเมื่อเป้าหมายเป็น null จึงเหมาะอย่างยิ่งสำหรับการเริ่มต้นเมื่อจำเป็น
ใช้ร่วมกับ ?. เพื่อจัดการค่าว่างอย่างปลอดภัยและกระชับ และยังใช้ ?? throw เพื่อหยุดทำงานทันทีได้ด้วย
คำถามที่พบบ่อย
บทเรียน “ตัวดำเนินการรวมค่าว่าง” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ตัวดำเนินการรวมค่าว่าง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ตัวดำเนินการรวมค่าว่าง”
ค่าเริ่มต้นด้วย ?? และ ??= คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “ตัวดำเนินการรวมค่าว่าง” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม
ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ชนิดค่าที่อาจเป็นค่าว่าง
- ตัวดำเนินการเงื่อนไขค่าว่าง
- ตัวดำเนินการรวมค่าว่าง
- ป้องกันค่าว่าง