รู้จักกับ Nullable

Nullable เป็นชื่อของ Generic Class ชนิดหนึ่ง สำหรับใช้ทำให้ค่าของตัวแปรเป็น null ได้
มันยังไงกันค่าของตัวแปรป็น null ได้ แล้วปกติมันเป็นไม่ได้หรือ

ความจริงตัวแปรในโลกของ .NET ก็มีทั้งที่เป็น Value Type กับ Reference Type
ถ้าเทียบกับโลกของ Java ก็คือ Primitive Type กับ Reference Type
ซึ่ง Reference Type ก็คือ Pointer ดีๆ นี่เอง หมายความว่าตัวแปรสองตัว อาจชี้มาที่ object เดียวกันในหน่วยความจำก็ได้
ขณะนี้ตัวแปรพวก Value Type ถ้ามีสองตัว มันจะกินเนื้อที่คนละแห่งกันในหน่วยความจำแน่นอน

ตัวแปรพวก Reference Type ปกติจะสามารถเป็น null ได้ คือไม่ได้ชี้ไปที่ไหนเลย
และแน่นอน ไอ้ตัวแปรพวกนี้ถ้าเอามาเรียกใช้ก็จะเกิด Exception ขึ้นให้เห็นได้อยู่บ่อยๆ

ส่วนตัวแปรพวก Value Type นี่ มันไม่ได้ชี้ไปที่ไหนอยู่แล้ว เพราะตัวมันเองคือตำแหน่งที่เก็บข้อมูลเลย
ซึ่งยังไงก็ไม่มีทางเป็น null ได้ ตัวแปรเหล่านี้เช่น Integer, Date, Color

Dim i As Integer = Nothing

จาก code ข้างบนนี้ ทำยังไงตัวแปร i ก็ไม่มีทางเป็น null, อย่างดีมันก็แค่กลายเป็น 0

ปัญหาก็คือ ในบางครั้งเราจำเป็นต้องเก็บค่า null จริงๆ เช่นเวลาเราต้องไปยุ่งกับฐานข้อมูลหรือเวลาที่ตัวเลข 0 มีความหมายต่างกับค่า null จริงๆ

เราสามารถเอาคลาส Nullable มาใช้งานได้ดังนี้

Dim i As Nullable(Of Integer) = Nothing

code ข้างบนนี้ จะทำให้ i เป็น null ได้สมใจอยาก

แล้วเวลาที่เราต้องการจะตรวจสอบดูว่าตกลงตัวแปร i นั้นมีค่าหรือเป็น null ให้ใช้เมธอด HasValue ซึ่งเป็นของคลาส Nullable ดังนี้

If i.HasValue Then
    Console.WriteLine("i is not null")
End If

ส่วนในบางกรณี เราจำเป็นต้องเอาค่าจากตัวแปรประเภท Nullable ไปใช้งาน
เราไปทำมันให้เป็น null ได้แล้ว แต่คราวนี้เกิดอยากจะได้ค่าจากมันขึ้นมาอีกแล้ว
หากมันเป็น null อยู่แล้วไปเอาค่ามันมาใช้งาน ก็เป็นอันเจ๊งแน่นอน ดังนั้น Nullable จึงมีเมธอด GetValueOrDefault ไว้ให้เรียกใช้ดังนี้

' บรรทัดต่อไปนี้จะเจ๊ง ถ้า i เป็น null
Console.WriteLine(Math.Pow(2, i))
' เราเลยต้องกำหนดค่า Default ให้มัน กรณีที่มันเป็น Null แต่เราอยากเอาค่าไปใช้จริงๆ
Console.WriteLine(Math.Pow(2, i.GetValueOrDefault(1)))

Nullable นี้เป็นคลาสพิเศษ ที่เวลาประกาศ เราไม่จำเป็นต้องเขียนชื่อคลาสยาวเหยียดอย่างที่แสดงตัวอย่างมาข้างบนก็ได้
จริงแล้ว เราสามารถใช้สัญลักษณ์ ? ต่อท้ายชื่อ Type ข้อมูลที่เป็นประเภท Value Type ก็เท่ากับเป็นการประกาศ Nullable Object แล้ว เช่น

' การประกาศตัวแปรสองบรรทัด ให้ผลเหมือนกัน
Dim x as Nullable(Of Date)
Dim y as Date?

ในภาษา c# ก็สามารถประกาศได้ในลักษณะเดียวกัน โดยใช้สัญลักษณ์ < > กรณีประกาศแบบ Generic หรือใช้สัญลักษณ์ ? เลยก็ได้

Nullable<DateTime> x;
DateTime? y;

One Response to “รู้จักกับ Nullable”

  1. Tansin Says:

    งงมานาน ขอบคุณครับ🙂


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 )

Twitter picture

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

Facebook photo

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

Google+ photo

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

Connecting to %s

%d bloggers like this: