ข้อแตกต่างระหว่าง Structure และ Class

โดยทั่วไปแล้วเวลาเขียนโปรแกรมเราอาจจะคุ้นเคยกับการเขียน Class กัน
แต่ความจริงในบางสถานการณ์ Structure จะเหมาะกับงานมากกว่า สถานการณ์ที่ว่านั้นคืออะไร

ใน .NET Framework มีสิ่งที่เรียกว่า Structure อยู่ด้วย ถ้าเราลองประกาศดู จะพบว่ามันเกือบจะเหมือนกับ Class ทุกประการ
กล่าวคือสามารถมีฟิลด์ มีเมธอด มี Property มี Event อยู่ในตัวมันได้ แม้กระทั่ง Implement Interface ได้
ที่หายไปอย่างหนึ่งก็คือ Structure ไม่มี Inherit

ถ้าจะกล่าวให้ตรงประเด็นที่สุดก็คือ Class นั้นเป็น Reference Type แต่ Structure เป็น Value Type
ผลที่ตามมาก็คือ

  1. ตัวแปรที่ประกาศไว้เป็น Class ต้องทำการ New จึงจะเป็นตัวขึ้นมา(ในหน่วยความจำ) แต่ Structure ประกาศปุ๊บมีตัวของมันขึ้นมาทันที ถ้าจะเรียกให้ถูกคือ Instance หรือ Object ของคลาสจะถูกสร้างขึ้นใน Heap แต่ค่าของ Structure จะถูกสร้างขึ้นใน Stack
  2. กรณี Class นั้นอาจมีตัวแปรสองตัวที่ชี้มายัง Object เดียวกันได้ แต่กรณี Structure นั้น ตัวแปรหนึ่งตัว ก็คือหนึ่งตำแหน่งในหน่วยความจำแน่นอน
  3. หากเรา Assign ค่าด้วยเครื่องหมายเท่ากับ ในกรณี Class จะเป็นแค่การเปลี่ยนค่า Pointer แต่กรณี Structure มันจะทำการ copy ค่าของ instance ทุกอย่างไปหมด
  4. Structure ไม่มี Access Modifier แบบ Protected (ก็มัน Inherit ไม่ได้ จะมี Protected ไปทำไม)
  5. Structure ไม่สามารถมี Constructor แบบไม่มี Parameter (เพราะการประกาศตัวแปรตามปกติก็เป็นการ New แบบไม่มี Parameter อยู่แล้ว จะไปมี Constructor อีกทำไม)

ว่าไัปชักจะยุ่ง มาดูตัวอย่างกันดีกว่า

Public Structure ComplexNumber

    Public x As Double
    Public y As Double

    Public Function z() As Double
        Return Math.Sqrt(x ^ 2 + y ^ 2)
    End Function

    Public Function angle() As Double
        Return Math.Atan(y / x)
    End Function

End Structure

ตัวอย่างคือเป็น Structure ซึ่งเก็บค่า Complex Number โดยที่ตัวมันจะเก็บค่าทั้งในแกน x และ y เอาไว้
และที่มีฟังค์ชั่นให้คำนวณหาค่า z และค่ามุม angle ได้
เวลาเรียกใช้งาน เราสามารถเรียกแบบนี้ได้

Dim c1, c2 As ComplexNumber
c1.x = 2
c1.y = 3

c2 = c1

c1.x = 5
c1.y = 6

' c2.x = 2, c2.y = 3

อย่างแรกที่เห็นคือเวลาประกาศตัวแปร Structure จะ New หรือไม่ New ก็ได้ มีค่าเท่ากัน
สามบรรทัดแรกเป็นการ assign ค่าให้ c1 ต่อมาบรรทัดที่ 5 ทำการ assign ค่า c1 ใส่ให้ c2
แล้วบรรทัดที่ 7 ก็เปลี่ยนค่า c1 ซะใหม่ แต่สุดท้ายแล้ว c2.x ก็ยังเท่ากับ 2 เหมือนเดิม
ที่เป็นอย่างนี้เพราะว่า การ assign ในบรรทัดที่ 5 นั้นเป็นการ copy ค่าทุกอย่างไปให้กัน
ซึ่งด้วย code ในลักษณะเดียวกันนี้ หากไปทำกับ Class แล้ว
ค่าของ c2 จะไม่ใช่ 2 แล้ว เพราะว่าบรรทัดที่ 5 จะทำให้ตัวแปร c2 “ชี้” ไปที่หน่วยความจำตำแหน่งเดียวกับ c1

ชนิดข้อมูลที่เป็น Structure ใน Base Class Library ที่มีใช้กันอยู่ประจำก็อย่างเช่น Date, Color
ตัวแปรพวกนี้ เวลา assign ค่าให้ตัวแปรแต่ละตัว ก็จะเป็นการใส่ค่าให้แบบแยกอิสระจากกัน
ดังนั้นถ้าจะสรุปแล้ว สถานการณ์ที่น่าจะพิจารณาใช้ Structure แทน Class ก็คือ

  1. เมื่อต้องการ assign ค่าแล้วให้แต่ละตัวแปรสามารถแก้ไขได้เป็นอิสระจากกัน
  2. เมื่อฟิลด์ข้อมูลมีขนาดไม่ใหญ่มาก (เพราะ Structure จองเนื้อที่แบบของใครของมัน จึงกินหน่วยความจำมาก)
  3. เมื่อต้องการความเร็ว (การจัดการหน่วยความจำใน stack จะเร็วกว่าใน heap)
  4. เมื่อไม่ต้องมีการ Inherit

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: