Indexers
นวพล สิงห์ลอ 650710834

C# Indexers
Indexer ช่วยให้เราเข้าถึง instance ของคลาส(class) หรือ struct โดยการใช้ index ซึ่งคล้ายกับ การเข้าถึง element ใน array
การสร้าง C# Indexer
สร้างง่ายๆเหมือนการสร้าง properties ใช้แทนชื่อเป็น this keyword ตามด้วย [ ] index เช่น
รายละเอียด
public - access modifier เช่น private
int - return type ของ indexer เช่น float, string
this - ระบุว่านี้คือ indexer ของคลาสนี้
int index - เข้าถึงโดยใช้ integer เป็น index เช่น float, string
get - method that returns values
set - method that assigns values
ตัวอย่าง

ตัวอย่างการใช้งานและเปรียบเทียบระหว่าง Indexer กับ Array
Indexer และ Array ใน C# มีความคล้ายคลึงกันตรงที่สามารถเข้าถึงข้อมูลโดยใช้ดัชนี (index) ได้ แต่ทั้งสองก็มีความแตกต่างกันในบางลักษณะการใช้งานและบทบาท
เห็นได้ว่า array จะสามารถเข้าถึง/เปลี่ยนแปลง element ได้ทุกตัว แต่ Indexer สามารถเพิ่มเงื่อนไขการเข้าถึง/เปลี่ยนแปลงค่าได้
สรุปความแตกต่าง :
ด้านการใช้งาน
เก็บข้อมูลหลายๆตัวภายใต้ตัวแปรตัวเดียว
ใช้ใน คลาส หรือ struct เพื่อทำให้วัตถุถูกเข้าถึงได้เหมือนกับอาร์เรย์
ด้านการเข้าถึง
ไม่สามารถควบคุมการเข้าถึงหรือสร้างเงื่อนไขได้
สามารถกำหนดเงื่อนไขในการเข้าถึงข้อมูลได้ผ่านเมธอด get( ) และ set( )
ตัวอย่างการใช้งาน
การเก็บข้อมูลง่ายๆ เช่น ตัวเลข, สตริง หรืออ็อบเจ็กต์
ใช้ในกรณีที่ต้องการให้คลาสหรือคอลเลกชันมีการใช้งานคล้ายอาร์เรย์มากขึ้น

ใน C# เราสามารถใช้งาน Indexer ร่วมกัน Generic Class ได้ (Generic class ช่วยให้เราสามารถกำหนดชนิดข้อมูล ที่จะถูกใช้งานได้ในภายหลัง เมื่อเราสร้างอินสแตนซ์ของคลาสนั้นๆ ทำให้เราสามารถสร้างคลาสที่มีความยืดหยุ่นของชนิดข้อมูลได้ คือ ให้ผู้ใช้กำหนด datatype เอง)
ตัวอย่าง generic indexer

Indexer สามารถโอเวอร์โหลดได้ Indexer สามารถประกาศด้วยพารามิเตอร์หลายตัวได้ และแต่ละพารามิเตอร์อาจเป็น data type ที่แตกต่างกัน ไม่จำเป็นที่ index จะต้องเป็นจำนวนเต็ม ใน C# สามารถกำหนด index เป็น data type อื่นๆ ได้ เช่น string
ตัวอย่าง overload indexer

ภาษา Java
ในภาษา Java ไม่มีฟีเจอร์ indexer โดยตรงเหมือนกับภาษา C# แต่สามารถใช้วิธีอื่นให้ทำงานใกล้เคียงกับ indexer ได้ทำให้เราสามารถเข้าถึงสมาชิกของคลาสโดยใช้ index ได้ โดยผ่าน getter และ setter ของ java
ตัวอย่าง Indexer ใน C#
ตัวอย่างการจำลอง indexer ใน Java
จากตัวอย่าง เมธอด get() รับค่าพารามิเตอร์ index มีหน้าที่ส่งค่าจากอาเรย์ 'numbers' element ที่ index กลับไป เมธอด set() รับค่าพารามิเตอร์ index และ value มีหน้าที่เปลี่ยนค่าในอาเรย์ 'number' element ที่ index ให้เท่ากับ value
ภาษา C
ในภาษา C ไม่มีฟีเจอร์ indexer เหมือนภาษา C# แต่เราสามารถจำลองการทำงานให้คล้ายกันกับ indexer ได้โดยใช้ฟังก์ชันและ array หรือ struct ที่มีการเข้าถึงข้อมูลผ่านตัวชี้ (pointer) หรืออาร์เรย์แบบธรรมดานั่นเอง
ตัวอย่าง Indexer ใน C#
ตัวอย่างการจำลอง indexer ใน C
จากตัวอย่างนี้ เราใช้ struct 'CIndexer' ที่มีอาร์เรย์ 'numbers' ขนาด 10 ช่อง จากนั้นใช้ฟังก์ชัน set( ) และ get( ) ในการกำหนดค่าและดึงค่าจากตำแหน่งที่ index ที่เราต้องการ
ภาษา Python
ในภาษา Python ไม่มีฟีเจอร์ indexer แบบที่มีในภาษา C# โดยตรง แต่ ภาษา Python สามารถจำลองการทำงานแบบ indexer ได้ด้วยการใช้เมธอดพิเศษ __getitem__ ( ) และ __setitem__( )
ตัวอย่าง Indexer ใน C#
ตัวอย่างการจำลอง indexer ใน Python
เมธอด __init__ ถูกเรียกเมื่อมีการสร้าง PythonIndexer มีการสร้าง self.numbers ให้เป็น list ขนาด 10 ช่อง
เมธอด __getitem__ ถูกใช้เพื่อดึงค่าจาก self.numbers ตาม index ที่ระบุ
เมธอด __setitem__ ถูกใช้เพื่อกำหนดค่าจาก self.numbers ตาม index ที่ระบุ

References
Wagner, B., van der Arend, M., Mialkin, A., Sherer, T., Schonning, N., Wenzel, M., Warren, G., Kulikov, P., Aymeric, A., Next Turn, Senchyna, J., Hoffman, M., B, M., Latham, L., & tompratt-AQ. (2024, August 23). Indexers. Microsoft Learn. Retrieved fromhttps://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/indexers/
amanakmsd. (2023, July 13). C# indexers. GeeksforGeeks. Retrieved from https://www.geeksforgeeks.org/c-sharp-indexers/?ref=shm
C# Indexer with example. (n.d.). Programiz. Retrieved fromhttps://www.programiz.com/csharp-programming/indexer
C# Indexers. (n.d.). TutorialsTeacher. Retrieved from https://www.tutorialsteacher.com/csharp/csharp-indexer
Java Encapsulation. (n.d.). Java get and set. w3schools. Retrieved from https://www.w3schools.com/java/java_encapsulation.asp
Python Software Foundation. (n.d.). Data model (Python 3.13.0): __getitem__, __setitem__. In Python documentation. Retrieved [October 11, 2024], from https://docs.python.org/3/reference/datamodel.html#object.__getitem__
Last updated