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

ตัวดำเนินการรวมค่าว่าง

ค่าเริ่มต้นด้วย ?? และ ??=

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

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

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