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