ข้อดีของภาษา C# เมื่อเทียบกับภาษาอื่น ๆ ตอนที่ 7

โอเวอร์โหลดตัวกระทำได้
บรรทัดที่ 9 ถึง 32 คือนิยามคลาส Complex ในคลาสนี้จะมีการโอเวอร์โหลดตัวกระทำ – (เครื่องหมายลบ) ให้ทำหน้าที่แปลงข้อมูลของออพเจ็กต์จากเลขจำนวนเต็มบวกเป็นเลขจำนวนเต็มลบ
บรรทัดที่ 11,12 ประกาศสมาชิกแบบฟิลด์ที่จะใช้เป็นตัวเก็บข้อมูล
บรรทัดที่ 13-15 คือนิยามเมธอดคอนสทรักเตอร์ที่เป็นตัวดีฟอลต์
บรรทัดที่ 16-20 คือการทำโอเวอร์โหลดเมธอดคอนสทรักเตอร์เป็นแบบมีพารามิเตอร์สองตัว โดยจะนำค่าจากพารามิเตอร์ทั้งสองนี้ไปกำหนดค่าให้แก่ฟิลด์สมาชิก
บรรทัดที่ 25-31 คือเมธอดที่ทำหน้าที่โอเวอร์โหลดตัวกระทำ – โปรดสังเกตว่าค่าส่งกลับและพารามิเตอร์เป็นชนิดข้อมูลเดียวกันคือ Complex ซึ่งถูกนิยามโดยคลาสนี้
บรรทัดที่ 27 สร้างออพเจ็กต์ (ที่ถูกอ้างถึงโดยตัวแปร) ชื่อ temp
บรรทัดที่ 28-29 นำค่ามาจากพารามิเตอร์คือ x และ y ของ c แล้วเปลี่ยนให้เป็นจำนวนลบ แล้วนำไปใส่ไว้ใน x และ y ของ temp จากนั้นส่งค่ากลับไปด้วยคำสั่ง return
บรรทัดที่ 37 สร้างออพเจ็กต์ c1 จากคลาส Complex ที่นิยามไว้โดยเรียกคอนสทรักเตอร์แบบมีพารามิเตอร์สองตัวแล้วส่งค่า 10 และ 20 ไป
บรรทัดที่ 38 เรียกหาเมธอด ShowXY() ของออพเจ็กต์ c1 ซึ่งเผยให้เห็นว่าค่า x และ y ของ c1 มีค่าเป็น 10 และ 20 ตามลำดับ
บรรทัดที่ 40 เรียกหาเมธอด ShowXY() ของออพเจ็กต์ c2 ซึ่งเผยให้เห็นว่าค่า x และ y ของ c2 มีค่าเป็น 0 และ 0 ตามลำดับ
บรรทัดที่ 42 จะพบว่าค่าของ x และ y จะเป็น -10 และ -20 ตามลำดับ
ขณะที่ return_type จะเป็นชนิดข้อมูลอะไรก็ได้ (ยกเว้น void)
ในโค้ดตัวอย่างการแสดงการโอเวอร์โหลดตัวกระทำแบบไบนารีจะคล้ายกับตัวอย่างก่อนหน้านี้
บรรทัดที่ 9 ถึง 31 คือนิยามคลาส Complex ที่มีการโอเวอร์โหลดตัวกระทำ + (เครื่องหมายบวก) ให้ทำหน้าที่นำฟิลด์สองฟิลด์ (x และ y) จากออพเจ็กต์หนึ่งมาบวกกับ x และ y ในอีกออพเจ็กต์หนึ่ง
บรรทัดที่ 13 คือนิยามเมธอดคอนสทรักเตอร์ที่เป็นตัวดีฟอลต์
บรรทัดที่ 15-19 คือการทำโอเวอร์โหลดเมธอดคอนสทรักเตอร์เป็นแบบมีพารามิเตอร์สองตัว โดยจะนำค่าจากพารามิเตอร์ทั้งสองนี้ไปกำหนดค่าให้แก่ฟิลด์สมาชิก
บรรทัดที่ 24-30 คือเมธอดที่ทำหน้าที่โอเวอร์โหลดตัวกระทำ + โปรดสังเกตว่าค่าส่งกลับและพารามิเตอร์ทั้งสองตัวเป็นชนิดข้อมูลเดียวกันคือ Complex ซึ่งถูกนิยามโดยคลาสนี้
บรรทัดที่ 26 สร้างออพเจ็กต์ (ที่ถูกอ้างถึงโดยตัวแปร) ชื่อ temp
บรรทัดที่ 27-28 นำค่ามาจากพารามิเตอร์ x และ y ของ c1 แล้วนำไปบวกกับพารามิเตอร์ x และ y ของ c2 แล้วนำไปใส่ไว้ใน x และ y ของ temp จากนั้นส่งค่ากลับไปด้วยคำสั่ง return
บรรทัดที่ 36 สร้างออพเจ็กต์ c1 จากคลาส Complex ที่นิยามไว้โดยเรียกคอนสทรักเตอร์แบบมีพารามิเตอร์สองตัวแล้วส่งค่า 10 และ 20 ไป
บรรทัดที่ 37 เรียกหาเมธอด ShowXY() ของออพเจ็กต์ c1 ซึ่งเผยให้เห็นว่าค่า x และ y ของ c1 มีค่าเป็น 10 และ 20 ตามลำดับ
บรรทัดที่ 38 สร้างออพเจ็กต์ c2 จากคลาส Complex ที่นิยามไว้โดยเรียกคอนสทรักเตอร์แบบมีพารามิเตอร์สองตัวแล้วส่งค่า 10 และ 20 ไป
บรรทัดที่ 39 เรียกหาเมธอด ShowXY() ของออพเจ็กต์ c2 ซึ่งเผยให้เห็นว่าค่า x และ y ของ c2 มีค่าเป็น 20 และ 30 ตามลำดับ
บรรทัดที่ 41 แสดงการเรียกใช้ตัวกระทำ + ที่ถูกโอเวอร์โหลดไว้ในคลาส Complex ซึ่งจะมีผลให้โค้ดบรรทัด 26-29 ทำงาน เมื่อสั่งให้แสดงค่าของ x และ y โดยเรียกเมธอด ShowXY()
บรรทัดที่ 42 จะพบว่าค่าของ x และ y จะเป็น 30 และ 50 ตามลำดับ
จึงได้รับคุณสมบัติตัวกระทำยูนารี + ที่ถูกโอเวอร์โหลดไว้ในคลาส Complex มาด้วยโดยอัตโนมัติ
สนับสนุนพอยน์เตอร์
พอยน์เตอร์เป็นชนิดข้อมูลแบบพิเศษที่เพิ่มขึ้นจากสองประเภทหลัก คือ แวลูไทป์ (value type) และรีเฟอร์เรนซ์ไทป์ (reference type) ส่วนพอยน์เตอร์เป็นชนิดข้อมูลชื่อ พอยน์เตอร์ไทป์ (pointer type) ชนิดข้อมูลแบบแวลูไทป์ทำหน้าที่เก็บข้อมูลโดยตรง เช่น int k = 123; ตัวแปร k จะมีค่า 123 เก็บอยู่ ส่วนชนิดข้อมูลแบบรีเฟอร์เรนซ์ไทป์ทำหน้าที่เก็บตัวอ้างอิงที่อ้างไปยังข้อมูล เช่น string s = “hello” ตัวแปร s ทำหน้าที่เก็บค่าอ้างอิงไปยังตำแหน่งที่เก็บข้อความว่า hello ในตัวแปร s ไม่ได้เก็บตัวชุดอักษร hello ส่วนชนิดข้อมูลแบบพอยน์เตอร์ทำหน้าที่เก็บเลขระบุตำแหน่งในหน่วยความจำของคอมพิวเตอร์ แนวคิดเรื่องพอยน์เตอร์มาจากภาษาเครื่อง (machine language) เพราะภายในซีพียูทุกตัวมีรีจิสเตอร์ (register) ที่ถูกกำหนดให้ทำหน้าที่เก็บค่าอ้างอิงไปยังตำแหน่งในหน่วยความจำ บางซีพียูมีรีจิสเตอร์แบบนี้หลายตัวและมีเทคนิคการอ้างถึงตำแหน่งในหน่วยความจำ (addressing technique) ได้หลายกลวิธี เมื่อภาษาซีถูกสร้างขึ้นจึงกำหนดให้มีพอยน์เตอร์เพื่อให้สามารถคอมไพล์ได้ลงรอยกับภาษาเครื่อง ภาษาซีและภาษาซีพลัสพลัส ที่แม้จะเป็นภาษาระดับสูงกว่าภาษาเครื่องหนึ่งชั้น แต่นักเขียนโค้ดยังคงมีจิตใจที่ยึดมั่นกับฮาร์ดแวร์อยู่มาก จึงเขียนโค้ดโดยใช้พอยน์เตอร์เป็นกำลังสำคัญ ขณะที่นักเขียนโค้ดภาษาซีชาร์ปส่วนใหญ่จิตหลุดพ้นจากฮาร์ดแวร์แล้ว จึงเขียนโด้ดตามคตินามธรรมโดยบริสุทธิ์ใจ ซึ่งการเขียนโค้ดแบบนี้ไม่มีความจำเป็นต้องใช้พอยน์เตอร์ เพราะสามารถใช้รีเฟอร์เรนซ์ไทป์ทดแทนได้อย่างสมบูรณ์
ชนิดข้อมูลกลุ่มเลขมีทศนิยม (float, double) และชนิดข้อมูลอื่น ๆ เช่น bool, enum, decimal, char เครื่องหมายดอกจันทร์ * คือตัวบอกให้รู้ว่าตัวแปรนี้เป็นพอยน์เตอร์ คำว่า identifier คือชื่อตัวแปรที่เราต้องการประกาศ
บรรทัดที่ 3 ถ้าเราไม่รู้ชนิดข้อมูลจะใช้คำว่า void ก็ได้แต่ไม่แนะนำให้ทำ
บรรทัดที่ 4 แสดงตัวอย่างที่ถูกต้องในการประกาศตัวแปรพอยน์เตอร์ชนิด int สามตัวภายในบรรทัดเดียวกัน
บรรทัดที่ 5 เป็นตัวอย่างการประกาศที่ผิด
บรรทัดที่ 7 คือการประกาศตัวแปรพอยน์เตอร์ที่เก็บค่าพอยน์เตอร์อีกทอดหนึ่ง หรือพอยน์เตอร์ที่ชี้ไปยังพอยน์เตอร์
บรรทัดที่ 8 คือการประกาศอาร์เรย์ของพอยน์เตอร์ เป็นอาร์เรย์มิติเดียวที่เก็บพอยน์เตอร์ชนิดเลขจำนวนเต็ม
ในโค้ดตัวอย่างแสดงการประกาศและใช้งานพอยน์เตอร์บรรทัดที่ 8 ถึง 11 เป็นนิยามเมธอด Foo ซึ่งเป็นเมธอดที่มีการใช้งานพอยน์เตอร์ คำว่า unsafe ที่อยู่ข้างหน้าเมธอดเป็นคำสั่งที่จะต้องใส่ไว้ก่อนหน้าชุดคำสั่งที่ใช้งานพอยน์เตอร์ การใส่ unsafe ไม่ได้หมายความว่าโค้ดที่ตามมาจะไม่ปลอดภัย แต่หมายถึงตัวรันทามน์จะไม่ดูแลรักษาความปลอดภัยให้ คงเป็นหน้าที่ของผู้เขียนโค้ดที่จะต้องรับผิดชอบเรื่องนี้ด้วยตนเอง ในวงเล็บของส่วนประกาศเมธอด
บรรทัดที่ 8 กำหนดให้มีพารามิเตอร์ตัวเดียวชื่อ p เป็นชนิดพอยน์เตอร์แบบเลขจำนวนเต็ม
บรรทัดที่ 10 คือโค้ดตัวอย่างแสดงการทำงานของพอยน์เตอร์โดยนำค่าที่อ้างอิงด้วย p มาบวกเข้ากับจำนวน 2 โปรดสังเกตว่าเมธอดนี้ไม่มีค่าส่งกลับเพราะไม่จำเป็นต้องส่งอะไรกลับ ผลลัพธ์ของการบวกจะถูกเขียนลงไปยังหน่วยความจำตำแหน่งที่ p ชี้อยู่โดยตรง
บรรทัดที่ 14 ถึง 20 แสดงวิธีเรียกใช้เมธอด Foo
บรรทัดที่ 16 ใส่คำสั่ง unsafe ตามด้วยวงเล็บปีกกาเปิดและปิด บรรทัดคำสั่งต่าง ๆ ที่อยู่ระหว่างวงเล็บปีกกาเปิดและปิดเป็นคำสั่งที่จะมีการใช้งานพอยน์เตอร์ อาร์กิวเมนต์ของการเรียกเมธอด Foo
บรรทัดที่ 18 ใช้เครื่องหมาย & นำหน้าตัวแปร i เพื่อระบุว่าเราต้องการส่งค่าตำแหน่งหน่วยความจำของตัวแปร i ไปให้ Foo ไม่ใช่ค่าของ i (เลข 5)
บรรทัดที่ 20 จะได้ผลลัพธ์เป็น 7 เพราะในบรรทัด 10 เรานำสิ่งที่เก็บอยู่ในตำแหน่งหน่วยความจำของตัวแปร i (คือจำนวน 5) มาบวกกับจำนวน 2 แล้วนำไปเก็บยังที่เดิม ค่าของตัวแปร i จึงกลายเป็น 7 เรื่องการใช้พอยน์เตอร์ในภาษาซีชาร์ปยังมีแง่มุมที่น่าสนใจอีกหลายอย่างที่จะนำเสนอในตอนต่อไป