https://github.com/Richter03/gitboard/issues/18
https://dotnetfiddle.net/Aeqys7Public Class alpha
Public data As Integer
End Class
Public Structure beta
Public data As Integer
End Structure
Public Module Program
Public Sub A_add(Input As alpha)
Input.data += 1
System.Console.WriteLine(Input.data)
End Sub
Public Sub B_add(Input As beta)
Input.data += 1
System.Console.WriteLine(Input.data)
End Sub
Public Sub Main()
Dim A As New alpha
A_add(A)
A_add(A)
A_add(A)
System.Console.WriteLine()
Dim B As New beta
B_add(B)
B_add(B)
B_add(B)
End Sub
End Module
จากโค๊ดด้านบนจะเห็นว่าโค๊ด alpha กับ beta และ A_add กับ B_add นั้นแทบจะก๊อปวางมาเลยแต่เมื่อโปรแกรมทำงานออกมาแล้วผมกลับแตกต่างกันอย่างสิ้นเชิง
- A_add(A) นั้นได้ผลออกมาเป็น 1, 2 และ 3
- B_add(B) นั้นได้ผลออกมาเป็น 1, 1 และ 1
ทำไมถึงได้ผลออกมาแตกต่างกันมาก ?เหตุที่แบบ A นั้นได้ผลลัพย์ไม่คงที่เนื่องจาก A เป็น คลาส(Class) ซึ่งเป็นข้อมูลอ้างอิง(Reference type) ดังนี้ข้อมูลที่อยู่กับ A จริงๆ จึงไม่ใช่ alpha.data แต่เป็นที่อยู่อ้างอิงที่จะนำไปยังตัวข้อมูลอีก
ดังนี้เมื่อทำการส่งข้อมูลเข้าไปยังชุดคำสั่งประมวลผล แทนที่ A จะคัดลอกส่งข้อมูล alpha.data ไปเหมือนกับ B ซึ่งทำให้ได้ผลลัพย์ไม่เปลี่ยนแปลง กลับส่งคัดลอกส่งที่อยู่ไปซึ่งเมื่อชุดคำสั่งทำการเปลี่ยนแปลงค่าภายในชุดคำสั่งจึงเกิดผลข้างเคียง(Side effect)
สำหรับท่านที่ไม่เคยเขียนโปรแกรมอาจจะงงว่า เอ๋ มันเป็นผลข้างเคียงยังไง ผมจะเขียนใหม่ให้เห็นภาพชัดขึ้นดังนี้
แบบ A
0 + 1 = 1
0 + 1 = 2
0 + 1 = 3
แบบ B
0 + 1 = 1
0 + 1 = 1
0 + 1 = 1
คำถามร่วมสนุกสำหรับทุกท่าน กลุ่มข้อมูลแบบ gamma กับ delta นั้นแตกต่างกันอย่างไรเมื่อเรานำไปใช้จัดการข้อมูล ?
Public Class gamma
Public data As beta
End Class
Public Structure delta
Public data As alpha
End Structure