Product book = new Product();
เพื่อนๆทราบแล้วว่าคำสั่ง new Product(); จะสั่งให้สร้างออบเจกต์ในหน่วยความจำ เราเรียก Product() ที่ตามหลังคำสั่ง new นี้ว่าคอนสตรักเตอร์ครับ (constructor)
Constructor
คือเมธอดพิเศษ ทำหน้าที่กำหนดการทำงานต่างๆให้กับออบเจกต์ใหม่ที่เกิดขึ้นจากคำสั่ง new ทันทีโดยอัตโนมัติ หากไม่กำหนดคอนสตรักเตอร์ ตัวแปลภาษา C# จะสร้างคอนสตรักเตอร์พื้นฐาน (default constructor) ให้เอง
ตัวอย่างต่อไปนี้คือ คอนสตรักเตอร์พื้นฐาน ของคลาส Product
public Product()
{
}
ตัวอย่างการเรียกใช้ default constructor จากแบบฝึกหัดที่ผ่านมา
รูปแบบการนิยามคอนสตรักเตอร์
access_modifiers ได้อธิบายแล้ว ณ บทความก่อนหน้านี้
identifier หมายถึง ชื่อคอนสตรักเตอร์ ต้องเป็นชื่อเดียวกับคลาสเท่านั้น
parameter_list หมายถึง พารามิเตอร์จำนวนหนึ่ง เช่น char[ ] id, char[ ] name, float price เป็นต้น
code_body หมายถึง คำสั่งต่างๆภายในคอนสตรักเตอร์
ตัวอย่างการประกาศคอนสตรักเตอร์ในคลาส Product
รูปข้างต้นออกแบบให้รายการพารามิเตอร์ (parameter_list) มีจำนวนสามตัวเท่ากับจำนวนฟิวด์ (เพื่อนๆจะออกแบบรายการพารามิเตอร์อย่างไรก็ได้ โดยคำนึงถึงการนำเอาไปใช้มากที่สุด) และสำหรับ code_body นี้ประกอบด้วยสามคำสั่ง ได้แก่
this.id = id; หมายถึง นำค่าพารามิเตอร์ id ที่รับมาส่งให้ฟิวด์ทางซ้ายของเครื่องหมายเท่ากับ แต่เนื่องจากชื่อฟิวด์และชื่อพารามิเตอร์ id เหมือนกัน จึงต้องแยกแยะด้วยคำสั่ง this
name = newName; หมายถึง นำค่าพารามิเตอร์ newName ที่รับมาส่งให้ฟิวด์ชื่อ name แต่เนื่องจากชื่อฟิวด์และชื่อพารามิเตอร์ต่างกัน จะใช้หรือไม่ใช้คำสั่ง this ก็ได้
Price = price; หมายถึง นำค่าพารามิเตอร์ price ที่รับมาส่งให้พรอเพอร์ตี้ชื่อ Price ซึ่งเป็นรูปแบบที่ควรกระทำมากที่สุด
เมื่อสร้างคอนสตรักเตอร์แล้ว เป็นผลให้ default constructor ที่มีอยู่ต้องถูกยกเลิกไป
เมธอด
มีหน้าที่อธิบายพฤติกรรมของคลาส หรือกระทำกระบวนการบางอย่าง จากรูปข้างต้นเมธอดชื่อ ToCharArray ทำหน้าที่เปลี่ยน String ให้เป็น char[ ] แสดงว่าเมธอดนี้เป็นพฤติกรรมหนึ่งของคลาส String
รูปแบบการนิยามเมธอด
access_modifiers ได้อธิบายแล้ว ณ บทความก่อนหน้านี้
return_type หมายถึง ไทป์ที่จะถูกส่งออกจากเมธอด (ด้วยคำสั่ง return ที่อยู่ภายในเมธอด หากไทป์นั้นไม่ใช่ void) ไปยังโค้ดที่เรียกใช้
identifier หมายถึง ชื่อเมธอด
parameter_list หมายถึง พารามิเตอร์จำนวนหนึ่ง เช่น char[ ] id, char[ ] name, float price เป็นต้น
code_body หมายถึง คำสั่งต่างๆภายในเมธอด
อาร์กิวเมนต์ VS พารามิเตอร์
การส่งค่าใดๆให้กับเมธอดที่ถูกเรียก ผมเรียกว่า อาร์กิวเมนต์ (argument) ส่วนตัวแปรใดๆที่นิยามจาก parameter_list ที่รับค่าอาร์กิวเมนต์ ผมเรียกว่า พารามิเตอร์ (parameter)
พารามิเตอร์และ modifier
เมื่อเรานิยามเมธอดจะต้องกำหนดเครื่องหมาย ( และ ) ต่อท้ายชื่อเมธอดเสมอ โดยจะมีพารามิเตอร์หรือไม่ก็ได้ นอกจากนี้ยังสามารถระบุ modifier ให้แก่พารามิเตอร์แต่ละตัวด้วย สำหรับ modifier แบ่งออกเป็น 4 ประเภท ได้แก่
- value parameter หรือพารามิเตอร์ขาเข้า กล่าวคือ เมื่อเกิดการแก้ไขค่าของตัวแปรใดๆที่เป็นพารามิเตอร์ ค่าที่เปลี่ยนแปลงนั้นจะไม่ส่งผลกระทบต่อค่าเดิมที่ส่งมา เปรียบได้กับเอกสารที่ถ่ายสำเนาแล้ว แผ่นสำเนาจะนำไปขีดเขียนอย่างไร ก็ไม่กระทบต่อต้นฉบับเดิมของมัน พารามิเตอร์ประเภทนี้พบเห็นทั่วไป โดยไม่ต้องกำหนด modifier
- ref parameter หรือพารามิเตอร์ขาออก กล่าวคือ เมื่อเกิดการแก้ไขค่าของตัวแปรใดๆที่เป็นพารามิเตอร์ ค่าที่เปลี่ยนแปลงนั้นจะส่งผลกระทบต่อค่าเดิมที่ส่งมา เปรียบได้กับเอกสารต้นฉบับซึ่งเป็นของเรา แล้วถูกเพื่อนเราเอาไปขีดเขียน ภายหลังส่งกลับให้เรา อย่างไรมันก็ถูกขีดเขียน พารามิเตอร์ประเภทนี้จะต้องกำหนดคำสั่ง ref ไว้สองตำแหน่ง
1. โค้ดที่ระบุอาร์กิวเมนต์จากการเรียกเมธอด เช่น Input(ref myName);
2. โค้ดที่นิยามเมธอด เช่น public void Input(ref name) { ... }
***หมายเหตุ อาร์กิวเมนต์ชื่อ name นี้จะต้องถูกำหนดค่าเริ่มต้นก่อนส่งเสมอ
- out parameter หรือพารามิเตอร์ขาออก เช่นเดียวกับ ref parameter ต่างที่ไม่จำเป็นต้องกำหนดค่าเริ่มต้นให้กับอาร์กิวเมนต์ก่อนก็ได้ จากตัวอย่างคือ ไม่จำเป็นต้องกำหนดค่าเริ่มต้นให้กับ name
- params parameter หรือพารามิเตอร์อาร์เรย์ สำหรับการส่งแบบอาร์เรย์ พารามิเตอร์ประเภทนี้ระบุคำสั่ง params ไว้เพียงโค้ดที่นิยามเมธอดเท่านั้น ส่วนโค้ดเรียกเมธอดไม่ต้องระบุ
โด้ดนิยามเมธอด เช่น public void Show(params int[ ] nameList) { ... }
***หมายเหตุ หากกำหนด params parameter ไว้กับพารามิเตอร์ประเภทอื่น จะต้องเขียน params parameter ไว้ลำดับสุดท้ายเท่านั้น
คอนสตรักเตอร์ VS เมธอด VS พรอเพอร์ตี้
เพื่อนๆที่เริ่มเขียนภาษา C# อย่าได้สบสนระหว่าง คอนสตรักเตอร์ กับ เมธอด หรือ เมธอด กับ พรอเพอร์ตี้ เพราะมันมีจุดสังเกตที่แต่งต่างกัน ดังนี้
- คอนสตรักเตอร์ไม่มี return _type เหมือนเมธอด (ดังที่กล่าวในหัวข้อ "รูปแบบการนิยามเมธอด")
- คอนสตรักเตอร์จะทำงานเพียงครั้งเดียว คือเมื่อมีการสร้างออบเจกต์ใหม่จากคำสั่ง new เท่านั้น
- เมธอดเรียกให้ทำงานได้หลายครั้งเช่นเดียวกับพรอเพอร์ตี้
- เมธอดจะมีเครื่องหมาย ( และ ) ตามหลังชื่อเสมอ ส่วนพรอเพอร์ตี้นั้นไม่มี
- เมธอดสามารถนิยามผลลัพธ์เหมือนพรอเพอร์ตี้ได้ แต่จะมุ่งไปที่กระบวนการภายใน มากกว่าการ ขอค่า หรือ กำหนดค่า แก่ฟิวด์เฉกเช่นพรอเพอร์ตี้
- พรอเพอร์ตี้ประเภท กำหนดค่า จะมีเครื่องหมาย = ตามท้ายชื่อ ส่วนเมธอดการ กำหนดค่า จะต้องผ่านทางอาร์กิวเมนต์เท่านั้น
แบบฝึกหัด
- ไม่มีครับ เรื่องนี้จะถูกประยุกต์ในตัวอย่างถัดไป
เพื่อนๆทราบแล้วว่าคำสั่ง new Product(); จะสั่งให้สร้างออบเจกต์ในหน่วยความจำ เราเรียก Product() ที่ตามหลังคำสั่ง new นี้ว่าคอนสตรักเตอร์ครับ (constructor)
Constructor
คือเมธอดพิเศษ ทำหน้าที่กำหนดการทำงานต่างๆให้กับออบเจกต์ใหม่ที่เกิดขึ้นจากคำสั่ง new ทันทีโดยอัตโนมัติ หากไม่กำหนดคอนสตรักเตอร์ ตัวแปลภาษา C# จะสร้างคอนสตรักเตอร์พื้นฐาน (default constructor) ให้เอง
ตัวอย่างต่อไปนี้คือ คอนสตรักเตอร์พื้นฐาน ของคลาส Product
public Product()
{
}
ตัวอย่างการเรียกใช้ default constructor จากแบบฝึกหัดที่ผ่านมา
รูปแบบการนิยามคอนสตรักเตอร์
[ access_modifiers ] identifier ( [ parameter_list ] ) { [ code_body ] } |
identifier หมายถึง ชื่อคอนสตรักเตอร์ ต้องเป็นชื่อเดียวกับคลาสเท่านั้น
parameter_list หมายถึง พารามิเตอร์จำนวนหนึ่ง เช่น char[ ] id, char[ ] name, float price เป็นต้น
code_body หมายถึง คำสั่งต่างๆภายในคอนสตรักเตอร์
ตัวอย่างการประกาศคอนสตรักเตอร์ในคลาส Product
รูปข้างต้นออกแบบให้รายการพารามิเตอร์ (parameter_list) มีจำนวนสามตัวเท่ากับจำนวนฟิวด์ (เพื่อนๆจะออกแบบรายการพารามิเตอร์อย่างไรก็ได้ โดยคำนึงถึงการนำเอาไปใช้มากที่สุด) และสำหรับ code_body นี้ประกอบด้วยสามคำสั่ง ได้แก่
this.id = id; หมายถึง นำค่าพารามิเตอร์ id ที่รับมาส่งให้ฟิวด์ทางซ้ายของเครื่องหมายเท่ากับ แต่เนื่องจากชื่อฟิวด์และชื่อพารามิเตอร์ id เหมือนกัน จึงต้องแยกแยะด้วยคำสั่ง this
name = newName; หมายถึง นำค่าพารามิเตอร์ newName ที่รับมาส่งให้ฟิวด์ชื่อ name แต่เนื่องจากชื่อฟิวด์และชื่อพารามิเตอร์ต่างกัน จะใช้หรือไม่ใช้คำสั่ง this ก็ได้
Price = price; หมายถึง นำค่าพารามิเตอร์ price ที่รับมาส่งให้พรอเพอร์ตี้ชื่อ Price ซึ่งเป็นรูปแบบที่ควรกระทำมากที่สุด
เมื่อสร้างคอนสตรักเตอร์แล้ว เป็นผลให้ default constructor ที่มีอยู่ต้องถูกยกเลิกไป
เมธอด
มีหน้าที่อธิบายพฤติกรรมของคลาส หรือกระทำกระบวนการบางอย่าง จากรูปข้างต้นเมธอดชื่อ ToCharArray ทำหน้าที่เปลี่ยน String ให้เป็น char[ ] แสดงว่าเมธอดนี้เป็นพฤติกรรมหนึ่งของคลาส String
รูปแบบการนิยามเมธอด
[ access_modifiers ] return_type identifier ( [ parameter_list ] ) { [ code_body ] } |
return_type หมายถึง ไทป์ที่จะถูกส่งออกจากเมธอด (ด้วยคำสั่ง return ที่อยู่ภายในเมธอด หากไทป์นั้นไม่ใช่ void) ไปยังโค้ดที่เรียกใช้
identifier หมายถึง ชื่อเมธอด
parameter_list หมายถึง พารามิเตอร์จำนวนหนึ่ง เช่น char[ ] id, char[ ] name, float price เป็นต้น
code_body หมายถึง คำสั่งต่างๆภายในเมธอด
อาร์กิวเมนต์ VS พารามิเตอร์
การส่งค่าใดๆให้กับเมธอดที่ถูกเรียก ผมเรียกว่า อาร์กิวเมนต์ (argument) ส่วนตัวแปรใดๆที่นิยามจาก parameter_list ที่รับค่าอาร์กิวเมนต์ ผมเรียกว่า พารามิเตอร์ (parameter)
พารามิเตอร์และ modifier
เมื่อเรานิยามเมธอดจะต้องกำหนดเครื่องหมาย ( และ ) ต่อท้ายชื่อเมธอดเสมอ โดยจะมีพารามิเตอร์หรือไม่ก็ได้ นอกจากนี้ยังสามารถระบุ modifier ให้แก่พารามิเตอร์แต่ละตัวด้วย สำหรับ modifier แบ่งออกเป็น 4 ประเภท ได้แก่
- value parameter หรือพารามิเตอร์ขาเข้า กล่าวคือ เมื่อเกิดการแก้ไขค่าของตัวแปรใดๆที่เป็นพารามิเตอร์ ค่าที่เปลี่ยนแปลงนั้นจะไม่ส่งผลกระทบต่อค่าเดิมที่ส่งมา เปรียบได้กับเอกสารที่ถ่ายสำเนาแล้ว แผ่นสำเนาจะนำไปขีดเขียนอย่างไร ก็ไม่กระทบต่อต้นฉบับเดิมของมัน พารามิเตอร์ประเภทนี้พบเห็นทั่วไป โดยไม่ต้องกำหนด modifier
- ref parameter หรือพารามิเตอร์ขาออก กล่าวคือ เมื่อเกิดการแก้ไขค่าของตัวแปรใดๆที่เป็นพารามิเตอร์ ค่าที่เปลี่ยนแปลงนั้นจะส่งผลกระทบต่อค่าเดิมที่ส่งมา เปรียบได้กับเอกสารต้นฉบับซึ่งเป็นของเรา แล้วถูกเพื่อนเราเอาไปขีดเขียน ภายหลังส่งกลับให้เรา อย่างไรมันก็ถูกขีดเขียน พารามิเตอร์ประเภทนี้จะต้องกำหนดคำสั่ง ref ไว้สองตำแหน่ง
1. โค้ดที่ระบุอาร์กิวเมนต์จากการเรียกเมธอด เช่น Input(ref myName);
2. โค้ดที่นิยามเมธอด เช่น public void Input(ref name) { ... }
***หมายเหตุ อาร์กิวเมนต์ชื่อ name นี้จะต้องถูกำหนดค่าเริ่มต้นก่อนส่งเสมอ
- out parameter หรือพารามิเตอร์ขาออก เช่นเดียวกับ ref parameter ต่างที่ไม่จำเป็นต้องกำหนดค่าเริ่มต้นให้กับอาร์กิวเมนต์ก่อนก็ได้ จากตัวอย่างคือ ไม่จำเป็นต้องกำหนดค่าเริ่มต้นให้กับ name
- params parameter หรือพารามิเตอร์อาร์เรย์ สำหรับการส่งแบบอาร์เรย์ พารามิเตอร์ประเภทนี้ระบุคำสั่ง params ไว้เพียงโค้ดที่นิยามเมธอดเท่านั้น ส่วนโค้ดเรียกเมธอดไม่ต้องระบุ
โด้ดนิยามเมธอด เช่น public void Show(params int[ ] nameList) { ... }
***หมายเหตุ หากกำหนด params parameter ไว้กับพารามิเตอร์ประเภทอื่น จะต้องเขียน params parameter ไว้ลำดับสุดท้ายเท่านั้น
คอนสตรักเตอร์ VS เมธอด VS พรอเพอร์ตี้
เพื่อนๆที่เริ่มเขียนภาษา C# อย่าได้สบสนระหว่าง คอนสตรักเตอร์ กับ เมธอด หรือ เมธอด กับ พรอเพอร์ตี้ เพราะมันมีจุดสังเกตที่แต่งต่างกัน ดังนี้
- คอนสตรักเตอร์ไม่มี return _type เหมือนเมธอด (ดังที่กล่าวในหัวข้อ "รูปแบบการนิยามเมธอด")
- คอนสตรักเตอร์จะทำงานเพียงครั้งเดียว คือเมื่อมีการสร้างออบเจกต์ใหม่จากคำสั่ง new เท่านั้น
- เมธอดเรียกให้ทำงานได้หลายครั้งเช่นเดียวกับพรอเพอร์ตี้
- เมธอดจะมีเครื่องหมาย ( และ ) ตามหลังชื่อเสมอ ส่วนพรอเพอร์ตี้นั้นไม่มี
- เมธอดสามารถนิยามผลลัพธ์เหมือนพรอเพอร์ตี้ได้ แต่จะมุ่งไปที่กระบวนการภายใน มากกว่าการ ขอค่า หรือ กำหนดค่า แก่ฟิวด์เฉกเช่นพรอเพอร์ตี้
- พรอเพอร์ตี้ประเภท กำหนดค่า จะมีเครื่องหมาย = ตามท้ายชื่อ ส่วนเมธอดการ กำหนดค่า จะต้องผ่านทางอาร์กิวเมนต์เท่านั้น
แบบฝึกหัด
- ไม่มีครับ เรื่องนี้จะถูกประยุกต์ในตัวอย่างถัดไป
Excellent site. Plenty of helpful info here. I'm sending it to some pals ans also sharing in delicious. And of course, thanks for your effort!
ตอบลบmy web blog; new cellulite treatment