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

ชนิดค่าที่อาจเป็นค่าว่าง

int? และ struct Nullable

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

เหตุใดจึงมีชนิดค่าแบบรองรับค่าว่าง

ชนิดค่าอย่าง int, bool และ DateTime จะเก็บค่าอยู่เสมอ โดย int มีค่าเริ่มต้นเป็น 0 และไม่เคยหมายถึง “ไม่มีค่า”

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

การประกาศด้วย int?

เติม ? หลังชนิดค่าเพื่อทำให้ชนิดนั้นรองรับค่าว่าง int? สามารถเก็บจำนวนเต็มใด ๆ หรือ null ได้

นี่เป็นวิธีที่พบบ่อยที่สุดในการเขียนชนิดค่าแบบรองรับค่าว่างในโค้ด C# ที่ใช้ในชีวิตประจำวัน

int? age = null;
int count = 5;
age = count;
System.Console.WriteLine(age);

Nullable<T> เบื้องหลัง

ไวยากรณ์ ? เป็นรูปแบบย่อ int? เป็นชนิดเดียวกันทุกประการกับ Nullable<int>

Nullable<T> เป็นโครงสร้างที่ห่อหุ้มชนิดค่าและเพิ่มธงสำหรับติดตามว่ามีค่าหรือไม่

Nullable<int> a = 10;
int? b = 10;
System.Console.WriteLine(a == b);

HasValue และค่า

ชนิดค่าที่รองรับค่าว่างทุกชนิดจะแสดงคุณสมบัติสองรายการ HasValue เป็น true เมื่อมีค่า และ Value จะคืนค่าพื้นฐานที่อยู่ภายใน

การอ่าน Value เมื่อ HasValue เป็น false จะโยน InvalidOperationException ดังนั้นจึงควรตรวจสอบก่อน

int? score = 42;
if (score.HasValue)
{
    System.Console.WriteLine(score.Value);
}

ตัวอย่างแบบสมบูรณ์

นี่คือ Program ฉบับสมบูรณ์ โดยกำหนดค่า ตรวจสอบ HasValue และแสดงผลลัพธ์

ลองเรียกใช้เพื่อดูว่าชนิดค่าที่รองรับค่าว่างทำงานอย่างไรเมื่อมีข้อมูลอยู่จริง

using System;

class Program
{
    static void Main()
    {
        int? temperature = 21;
        if (temperature.HasValue)
            Console.WriteLine("Temp: " + temperature.Value);
        else
            Console.WriteLine("No reading");
    }
}

เมื่อค่าเป็น null

การกำหนด null ทำให้ HasValue คืนค่า false จากนั้นสาขา else จะทำงาน

รูปแบบนี้ช่วยให้คุณจัดการค่าที่อาจไม่มีได้อย่างปลอดภัยโดยไม่ทำให้โปรแกรมหยุดทำงาน

using System;

class Program
{
    static void Main()
    {
        int? temperature = null;
        if (temperature.HasValue)
            Console.WriteLine(temperature.Value);
        else
            Console.WriteLine("No reading");
    }
}

GetValueOrDefault

GetValueOrDefault() จะคืนค่าหากมีค่าอยู่ มิฉะนั้นจะคืนค่าเริ่มต้นของชนิดนั้น เช่น 0 สำหรับ int

คุณสามารถส่งค่าแทนของคุณเองได้เช่นกัน โดย GetValueOrDefault(100) จะคืนค่า 100 เมื่อไม่มีค่า

int? quantity = null;
int result = quantity.GetValueOrDefault(100);
System.Console.WriteLine(result);

การแปลงโดยนัยเป็นชนิดที่รับค่าว่างได้

ค่า int ปกติจะแปลงเป็น int? โดยอัตโนมัติ เพราะค่าปกติทุกค่าล้วนเป็นค่าที่รับค่าว่างได้

การแปลงย้อนกลับจะไม่เกิดขึ้นโดยอัตโนมัติ การแปลงจาก int? กลับเป็น int ต้องใช้การแคสต์อย่างชัดแจ้งหรือใช้ค่าแทน เนื่องจากค่าที่รับค่าว่างได้อาจไม่มีค่า

int plain = 7;
int? wrapped = plain;
int back = (int)wrapped;
System.Console.WriteLine(back);

ชนิดค่าที่รับค่าว่างได้ชนิดอื่น

ชนิดค่าทุกชนิดใช้งานได้ เช่น bool?, double?, DateTime? และแม้แต่โครงสร้างแบบกำหนดเอง

bool? มีสามสถานะ ได้แก่ true, false และ null ซึ่งมีประโยชน์สำหรับคำถามใช่หรือไม่ใช่ที่ยังไม่ได้รับคำตอบ

bool? agreed = null;
double? price = 9.99;
System.Console.WriteLine(agreed.HasValue);
System.Console.WriteLine(price.Value);

ชนิดอ้างอิงรับค่าว่างได้อยู่แล้ว

คลาสอย่าง string และอาร์เรย์สามารถเป็น null ได้อยู่แล้ว จึงไม่จำเป็นต้องใช้ตัวห่อหุ้ม Nullable<T>

เครื่องหมาย ? บนชนิดอ้างอิง เช่น string? มีความหมายแตกต่างกัน นั่นคือคำกำกับชนิดอ้างอิงที่รับค่าว่างได้ ไม่ใช่โครงสร้าง Nullable<T>

การเปรียบเทียบค่าที่รับค่าว่างได้

การเปรียบเทียบทำได้ แต่โปรดจำไว้ว่าค่าว่างมีพฤติกรรมพิเศษ ค่าว่างสองค่าถือว่าเท่ากัน และการเปรียบเทียบตามลำดับใด ๆ ที่เกี่ยวข้องกับค่าว่างจะคืนค่า false

ดังนั้น null < 5 จึงเป็น false และ null > 5 ก็เป็น false เช่นกัน

int? x = null;
System.Console.WriteLine(x < 5);
System.Console.WriteLine(x == null);

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

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

สรุปทบทวน

ชนิดค่าที่รับค่าว่างได้ช่วยให้ชนิดค่าสามารถเก็บ null ได้ด้วย เขียนในรูป int? ซึ่งเทียบเท่ากับ Nullable<int>

ใช้ HasValue เพื่อตรวจสอบ ใช้ Value เพื่ออ่านค่าเมื่อมีค่าอยู่เท่านั้น และใช้ GetValueOrDefault() เพื่อจัดการกรณีไม่มีค่าด้วยค่าแทนที่ปลอดภัย ชนิดอ้างอิงสามารถรับค่าว่างได้อยู่แล้ว

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

บทเรียน “ชนิดค่าที่อาจเป็นค่าว่าง” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ชนิดค่าที่อาจเป็นค่าว่าง”

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

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

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

บทเรียน “ชนิดค่าที่อาจเป็นค่าว่าง” ใช้เวลานานแค่ไหน

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

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

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

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

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