Null-Conditional Operator ใน C# (?? | ?. | ?[])

Null คือ สิ่งที่โปรแกรมเมอร์ต้องเจออยู่ตลอด มันมักจะถูกตีความหมายว่า ไม่มีค่า หรือ ไม่มีข้อมูล หลายครั้งที่เราต้องเช็คความเป็น Null ก่อนที่จะดำเนินการใดๆ การเช็คแต่ละครั้ง เสียทั้งเวลาและเนื้อที่ในการเขียน ไมโครซอฟท์จึงได้สร้างโอเปอร์เรเตอร์สำหรับการเช็คค่า Null โดยเฉพาะ เพื่อความสะดวกในการเขียนโปรแกรมและเพื่อความสวยงามของโค้ด

โอเปอร์เรเตอร์สำหรับเช็คค่า Null จะมี สามแบบ คือ ?? (ถ้า Null เปลี่ยนค่าเป็น) ?. (ถ้าไม่ Null แล้วไงต่อ) และ ?[] (ถ้าไม่ Null ขอหยิบของในคอลเลคชัน)

?? (ถ้า Null เปลี่ยนค่าเป็น)

ยกตัวอย่าง มิสเตอร์เอ (Mra) ต้องรับข้อมูลชื่อ (Name) จากตัวแปร inputdata แต่โปรแกรมเมอร์ไม่แน่ใจว่า inputdata เป็น null หรือไม่ หาก inputdata เป็น null ให้ค่า Name ของมิสเตอร์เอมีค่าเป็น “John Doe”

จากโจทย์ข้างต้น ถ้าใช้ if จะได้ โค้ดแบบที่ 1

if (inputdata == null) { Mra.Name = "John doe"; } else { Mra.Name = inputdata; }

ถ้าต้องการให้สั้นกว่านี้ จะได้โค้ดแบบที่ 2

Mra.Name = inputdata == null ? "John doe" : inputdata;

แบบที่ 2 ถึงจะสั้นกว่าแบบแรกและใช้เพียงสเตทเมนท์ (Statement) เดียว แต่ก็มีมีการกล่าวอ้าง inputdata ถึงสองครั้ง C# จึงมีโอเปอร์เรเตอร์ (Operator) สำหรับการนี้ ซึ่งจะได้โค้ดแบบที่ 3

Mra.Name = inputdata ?? "John doe";

โค้ดแบบที่ 3 มีข้อดีคือ มีเพียงสเตทเมนท์เดียวและมีการกล่าวอ้าง inputdata แค่เพียงครั้งเดียวเท่านั้น

?. (ถ้าไม่ Null แล้วไงต่อ)

(เริ่มมีใช้งานใน Visual Studio 2015)

ยกตัวอย่าง อยากรู้ว่าวิชาเลข (MathClass) มีนักเรียนลงเรียนกี่คน โปรแกรมเมอร์ไม่แน่ใจว่าว่ามีนักเรียน (Students) ลงเรียนหรือไม่ ถ้าไม่มี จะไม่มีการอินนิเชียลไลซ์ (Initialize) Students ใน MathClass หรือพูดง่ายๆก็คือ Students จะเป็น null ฉะนั้นก่อนจะนับจำนวนนักเรียน (NumberStudent) จะต้องเช็คก่อนว่า Students เป็น null หรือไม่ ถ้าไม่ ให้นับจำนวนนักเรียน ถ้าเป็น null ก็ให้จำนวนนักเรียนเป็น null

จากโจทย์ โค้ดที่ได้จะเป็นดังโค้ดแบบที่ 1

int? NumberStudent = MathClass.Students != null ? (int?)MathClass.Students.Count : null;

โค้ดแบบที่ 1 มีเพียงสเตทเมนท์เดียว แต่มีการอ้างอิง MathClass.Students สองครั้งแต่ C# ใน Visual Studio 2015 สามารถเขียนให้สั้นลงได้อีก ซึ่งจะได้โค้ดแบบที่ 2

int? NumberStudent = MathClass.Students?.Count;

โด้ดแบบที่ 2 สั้นกว่าแบบที่ 1 มีการอ้างอิง MathClass.Students แค่ครั้งเดียว อีกทั้งยังไม่ต้องเขียนโค้ดเพื่อแปลง int เป็น int? อีกด้วย

?[] (ถ้าไม่ Null ขอหยิบของในคอลเลคชัน)

(เริ่มมีใช้งานใน Visual Studio 2015)

ยกตัวอย่าง อยากรู้ว่าวิชาเลข (MathClass) นักเรียนที่สมัครคนแรก (FirstStudent) คือใคร โปรแกรมเมอร์ไม่แน่ใจว่าว่ามีนักเรียน (Students) ลงเรียนหรือไม่ ถ้าไม่มี จะไม่มีการอินนิเชียลไลซ์ (Initialize) Students ใน MathClass หรือพูดง่ายๆก็คือ Students จะเป็น null ฉะนั้นก่อนจะหยิบนักเรีนคนแรก จะต้องทำการตรวจสอบก่อนว่า MathClass.Students เป็น null หรือไม่ ถ้าไม่ ให้หยิบนักเรียนคนแรกมา ถ้า null ก็ให้เป็น null

จากโจทย์ โค้ดที่ได้จะเป็นดังโค้ดแบบที่ 1

var FirstStudent = MathClass.Students != null ? MathClass.Students[0] : null;

โค้ดแบบที่ 1 มีเพียงสเตทเมนท์เดียว แต่มีการอ้างอิง MathClass.Students สองครั้งแต่ C# ใน Visual Studio 2015 สามารถเขียนให้สั้นลงได้อีก ซึ่งจะได้โค้ดแบบที่ 2

var FirstStudent = MathClass.Students?[0];

โด้ดแบบที่ 2 สั้นกว่าแบบที่ 1 มีการอ้างอิง MathClass.Students แค่ครั้งเดียว

สิ่งที่ต้องระวัง ไม่ว่าจะเป็นโค้ดแบบที่ 1 หรือ โค้ดแบบที่ 2 ก็คือ มันเป็นการเช็ค MathClass.Student ว่าเป็น null หรือไม่ แต่ไม่ได้เป็นการยืนยันว่า MathClass.Student[0] จะไม่เป็น null ในการใช้งานจริงจะต้องเช็คการมีตัวตนของ MathClass.Student[0] อีกรอบหนึ่ง

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s