0Pricing
C# Academy · บทเรียน

ตัวทำดัชนี

เข้าถึงออบเจ็กต์ด้วยไวยากรณ์คล้ายอาร์เรย์

ตัวทำดัชนี เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

Indexer คืออะไร

Indexerช่วยให้ออบเจ็กต์ถูกเข้าถึงด้วยไวยากรณ์ [ ] เช่นเดียวกับอาร์เรย์ คุณกำหนดมันด้วย this[...] จึงเหมาะอย่างยิ่งสำหรับคลาสที่มีลักษณะเหมือนคอลเลกชัน

using System;

class Week
{
    private string[] _days = { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" };

    public string this[int index] => _days[index];
}

class Program
{
    static void Main()
    {
        var w = new Week();
        Console.WriteLine(w[0]);
        Console.WriteLine(w[6]);
    }
}

ไวยากรณ์ของ Indexer

Indexer มีลักษณะเหมือนพร็อพเพอร์ตี แต่ใช้ this และรับรายการพารามิเตอร์ในวงเล็บเหลี่ยม โดยมี get และอาจมี set

using System;

class Scores
{
    private int[] _data = new int[5];

    public int this[int i]
    {
        get { return _data[i]; }
        set { _data[i] = value; }
    }
}

class Program
{
    static void Main()
    {
        var s = new Scores();
        s[0] = 90;
        s[1] = 75;
        Console.WriteLine(s[0] + ", " + s[1]);
    }
}

การอ่านและเขียนผ่าน Indexer

เมื่อมีทั้งตัวอ่านค่าและตัวกำหนดค่า คุณสามารถกำหนดค่าและอ่านสมาชิกได้เหมือนอาร์เรย์ ขณะที่คลาสยังคงควบคุมพื้นที่จัดเก็บข้อมูลเบื้องหลัง

using System;

class Grid
{
    private int[] _cells = new int[3];

    public int this[int i]
    {
        get => _cells[i];
        set => _cells[i] = value;
    }
}

class Program
{
    static void Main()
    {
        var g = new Grid();
        for (int i = 0; i < 3; i++) g[i] = i * 10;
        Console.WriteLine(g[0] + ", " + g[1] + ", " + g[2]);
    }
}

การตรวจสอบใน Indexer

เนื่องจาก Indexer เป็นโค้ดรูปแบบหนึ่ง คุณจึงสามารถตรวจสอบดัชนีและส่งข้อผิดพลาดที่ชัดเจนเมื่อมีการเข้าถึงนอกช่วงได้

using System;

class SafeList
{
    private int[] _data = new int[3];

    public int this[int i]
    {
        get
        {
            if (i < 0 || i >= _data.Length)
                throw new IndexOutOfRangeException("Bad index: " + i);
            return _data[i];
        }
        set { _data[i] = value; }
    }
}

class Program
{
    static void Main()
    {
        var list = new SafeList();
        list[1] = 42;
        Console.WriteLine(list[1]);
    }
}

Indexer ที่ใช้คีย์ข้อความ

พารามิเตอร์ของ Indexer ไม่ได้จำกัดอยู่ที่ int คีย์ string จะเปลี่ยนคลาสของคุณให้เป็นการค้นหาที่มีลักษณะเหมือนพจนานุกรม

using System;
using System.Collections.Generic;

class Config
{
    private Dictionary<string, string> _map = new Dictionary<string, string>();

    public string this[string key]
    {
        get => _map.ContainsKey(key) ? _map[key] : "(none)";
        set => _map[key] = value;
    }
}

class Program
{
    static void Main()
    {
        var c = new Config();
        c["theme"] = "dark";
        Console.WriteLine(c["theme"]);
        Console.WriteLine(c["missing"]);
    }
}

พารามิเตอร์หลายรายการ

Indexer สามารถรับพารามิเตอร์ได้มากกว่าหนึ่งรายการ เหมาะสำหรับเมทริกซ์หรือกริดสองมิติที่เข้าถึงด้วย matrix[row, col]

using System;

class Matrix
{
    private int[,] _data = new int[2, 2];

    public int this[int row, int col]
    {
        get => _data[row, col];
        set => _data[row, col] = value;
    }
}

class Program
{
    static void Main()
    {
        var m = new Matrix();
        m[0, 0] = 1;
        m[1, 1] = 9;
        Console.WriteLine(m[0, 0] + ", " + m[1, 1]);
    }
}

Indexer แบบอ่านได้อย่างเดียว

ละเว้นตัวกำหนดค่าเพื่อสร้าง Indexer แบบอ่านได้อย่างเดียว ซึ่งเปิดเผยข้อมูลโดยไม่อนุญาตให้โค้ดภายนอกแก้ไข

using System;

class Fibonacci
{
    public int this[int n]
    {
        get
        {
            int a = 0, bv = 1;
            for (int i = 0; i < n; i++)
            {
                int t = a + bv;
                a = bv;
                bv = t;
            }
            return a;
        }
    }
}

class Program
{
    static void Main()
    {
        var fib = new Fibonacci();
        Console.WriteLine(fib[7]);
    }
}

Indexer เทียบกับพร็อพเพอร์ตี

พร็อพเพอร์ตีเข้าถึงด้วยชื่อ (obj.Name) ส่วน Indexer เข้าถึงด้วยคีย์ (obj[key]) ใช้ Indexer เมื่อออบเจ็กต์มีพฤติกรรมเหมือนคอลเลกชัน

using System;

class Inventory
{
    private int[] _stock = new int[4];
    public int Total => _stock.Length;          // property
    public int this[int slot]                    // indexer
    {
        get => _stock[slot];
        set => _stock[slot] = value;
    }
}

class Program
{
    static void Main()
    {
        var inv = new Inventory();
        inv[2] = 15;
        Console.WriteLine("Slot 2: " + inv[2] + ", Total slots: " + inv.Total);
    }
}

Indexer แบบโอเวอร์โหลด

คุณสามารถกำหนด Indexer หลายตัวที่ใช้ชนิดพารามิเตอร์แตกต่างกัน แล้วคอมไพเลอร์จะเลือกตัวที่ตรงกัน

using System;
using System.Collections.Generic;

class People
{
    private List<string> _names = new List<string> { "Ann", "Bob", "Cara" };

    public string this[int i] => _names[i];
    public int this[string name] => _names.IndexOf(name);
}

class Program
{
    static void Main()
    {
        var p = new People();
        Console.WriteLine(p[1]);
        Console.WriteLine(p["Cara"]);
    }
}

การวนซ้ำออบเจ็กต์ที่ใช้ดัชนี

ผสาน Indexer เข้ากับพร็อพเพอร์ตีจำนวนเพื่อวนซ้ำคอลเลกชันที่กำหนดเองได้อย่างเป็นธรรมชาติ

using System;

class Ring
{
    private int[] _data = { 10, 20, 30 };
    public int Count => _data.Length;
    public int this[int i] => _data[i % _data.Length];
}

class Program
{
    static void Main()
    {
        var ring = new Ring();
        for (int i = 0; i < 5; i++)
            Console.Write(ring[i] + " ");
        Console.WriteLine();
    }
}

การประกอบทุกอย่างเข้าด้วยกัน

Indexer ทำให้คลาสห่อหุ้มมีความรู้สึกเหมือนคอลเลกชันดั้งเดิม โดยซ่อนรายละเอียดการจัดเก็บข้อมูลไว้เบื้องหลังไวยากรณ์วงเล็บที่คุ้นเคย

using System;
using System.Collections.Generic;

class Phonebook
{
    private Dictionary<string, string> _book = new Dictionary<string, string>();

    public string this[string name]
    {
        get => _book.TryGetValue(name, out var num) ? num : "unknown";
        set => _book[name] = value;
    }
}

class Program
{
    static void Main()
    {
        var pb = new Phonebook();
        pb["Alice"] = "555-1234";
        Console.WriteLine("Alice: " + pb["Alice"]);
        Console.WriteLine("Zed: " + pb["Zed"]);
    }
}

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจของคุณเกี่ยวกับ Indexer

สรุปทบทวน

Indexerใช้ this[...] เพื่อให้คลาสเข้าถึงข้อมูลในลักษณะเดียวกับอาร์เรย์ รองรับ get/set พารามิเตอร์ทุกชนิด (int, ข้อความ หรือหลายรายการ) การตรวจสอบ การโอเวอร์โหลด และรูปแบบอ่านได้อย่างเดียว ใช้ Indexer กับคลาสที่มีลักษณะเหมือนคอลเลกชัน และใช้พร็อพเพอร์ตีที่มีชื่อกับคุณลักษณะเฉพาะ

using System;

class Demo
{
    private int[] _v = new int[3];
    public int this[int i]
    {
        get => _v[i];
        set => _v[i] = value;
    }
}

class Program
{
    static void Main()
    {
        var d = new Demo();
        d[0] = 100;
        Console.WriteLine(d[0]);
    }
}

คำถามที่พบบ่อย

บทเรียน “ตัวทำดัชนี” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ตัวทำดัชนี” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ตัวทำดัชนี”

เข้าถึงออบเจ็กต์ด้วยไวยากรณ์คล้ายอาร์เรย์ คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “ตัวทำดัชนี” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม

ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. คุณสมบัติที่สร้างตัวเข้าถึงอัตโนมัติ
  2. คุณสมบัติเต็มรูปแบบพร้อมฟิลด์สำรอง
  3. สมาชิกแบบมีนิพจน์เป็นตัวลำตัว
  4. ตัวทำดัชนี
← กลับไปที่ C# Academy