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 สามารถเพิ่มเงื่อนไขการเข้าถึง/เปลี่ยนแปลงค่าได้

สรุปความแตกต่าง :

หัวข้อ
Array
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