Nattawut Phetmak
Jack of all Trades
การทำงานย่อยใน Visual Basic สามารถแบ่งได้เป็น 2 อย่างคือ Function และ Sub
ความแตกต่างคือ Function เป็นการทำงานย่อยที่ (ควรจะ) ส่งค่าแบบ ByVal (ส่งค่าของตัวแปรเข้าไป ถ้ามีการเปลี่ยนค่าระหว่างทำงาน ตัวแปรต้นทางจะไม่เปลี่ยน) และเมื่อทำงานเสร็จเรียบร้อยก็ (ควรจะ) ส่งค่าคืนกลับมา เช่น
Private Function square(ByVal x As Integer) As Integer
Return x * x
End Function
หรือถ้าจะแหกฎนั้น
Private Function square(ByVal x As Integer, ByRef answer As Integer)
answer = x * x
Return Nothing
End Function
สังเกตว่าต้องมีการคืนค่าเสมอนะครับ (แม้จะเขียนโดยที่ไม่ให้คืนค่าก็ตาม)
ส่วนการใช้ Sub จะถูกมองคล้ายๆ การแยกส่วนของ code ออกเป็นหลายๆ ส่วน ตัวแปรส่วนใหญ่ส่งเข้าไปแบบ ByRef (เมื่อเปลี่ยนค่าตัวแปร ตัวแปรที่ต้นทางจะเปลี่ยนด้วย) และเมื่อทำงานเสร็จจะไม่มีการคืนค่าครับ
Private Sub square(ByRef x As Integer, ByRef answer As Integer)
answer = x * x
End Sub
ความแตกต่างอีกอย่างคือการที่ Sub สามารถ Handles เหตุการณ์ต่างๆ เช่นการคลิกเมาส์ได้ โดยเปลี่ยนไปส่งผ่านตัวแปรที่เกี่ยวกับ event 2 ตัวแทน (ซึ่งจะเหมือนกับการดับเบิลคลิกเข้าไปเขียน code) ดังนี้
Private Sub testSquare(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn1.Click
Dim x As Integer = 5
MessageBox.Show(x * x)
End Sub
(อันที่จริงแล้ว Function ก็ Handles ได้ แต่มักไม่ทำกัน เพราะผิด concept)
สรุปคือตัดสินใจจากสถานการณ์นั้นๆ ว่าจะใช้ Function (มีการคืนค่า) หรือจะใช้ Sub (จัดระเบียบ code, อิงกับ event ภายนอก) ให้เหมาะกับงานด้วยนะครับ