Hướng dẫn C#: Indexer trong lập trình C#

Trong ngôn ngữ C#, Indexer là một loại thuộc tính đặc biệt cho phép lớp hoặc cấu trúc truy cập các phần tử của nó dựa trên chỉ mục, giống như cách làm việc với mảng. Indexer sử dụng cú pháp dấu ngoặc vuông ([]) để truy cập các phần tử của đối tượng thay vì cú pháp dấu chấm (.) truyền thống. Điều này đặc biệt hữu ích khi làm việc với các cấu trúc dữ liệu có tính chất tương tự như tập hợp.

Định nghĩa Indexer

Indexer được định nghĩa tương tự như thuộc tính, nhưng sử dụng dấu ngoặc vuông [] thay vì dấu ngoặc đơn (). Dưới đây là một ví dụ đơn giản về định nghĩa Indexer:

public class MyCollection
{
    private List<int> storage = new List<int>();

    public int this[int index]
    {
        get
        {
            if (index < 0 || index >= storage.Count)
                throw new ArgumentOutOfRangeException("index", "Chỉ số vượt quá phạm vi cho phép.");

            return storage[index];
        }
        set
        {
            if (index < 0 || index >= storage.Count)
                throw new ArgumentOutOfRangeException("index", "Chỉ số vượt quá phạm vi cho phép.");

            storage[index] = value;
        }
    }
}

Trong ví dụ này, lớp MyCollection định nghĩa một Indexer có tên this[int index]. Indexer này bao gồm hai phương thức truy cập: getset. Cả hai đều kiểm tra tính hợp lệ của chỉ số, và nếu chỉ số hợp lệ, chúng sẽ trả về hoặc gán giá trị tương ứng.

Sử dụng Indexer

Sau khi định nghĩa Indexer, bạn có thể truy cập các phần tử của đối tượng giống như truy cập mảng:

class Program
{
    static void Main()
    {
        MyCollection col = new MyCollection();
        col.Add(10); // Giả sử có phương thức Add để thêm phần tử
        col.Add(20);
        col.Add(30);

        Console.WriteLine(col[1]); // Kết quả: 20
        col[1] = 25;
        Console.WriteLine(col[1]); // Kết quả: 25
    }
}

Indexer đa tham số

Ngoài Indexer với một tham số kiểu số nguyên, bạn có thể định nghĩa Indexer với nhiều tham số. Ví dụ, nếu bạn có cấu trúc dữ liệu hai chiều, bạn có thể muốn sử dụng hai chỉ số để truy cập phần tử:

public class Matrix
{
    private int[,] grid = new int[3, 3];

    public int this[int row, int column]
    {
        get
        {
            return grid[row, column];
        }
        set
        {
            grid[row, column] = value;
        }
    }
}

Trong ví dụ này, lớp Matrix sử dụng hai chỉ số nguyên để truy cập các phần tử trong ma trận.

Lưu ý quan trọng khi sử dụng Indexer

  1. Đặt tên theo quy ước: Indexer thường được đặt tên là this, kèm theo danh sách tham số chỉ mục. Điều này giúp trình biên dịch nhận biết đây là Indexer chứ không phải thuộc tính thông thường.
  2. Kiểu dữ liệu: Kiểu của Indexer phải phù hợp với kiểu dữ liệu trả về. Đối với tập hợp, kiểu này thường là kiểu của phần tử trong tập hợp.
  3. Xử lý ngoại lệ: Cần kiểm tra giới hạn trong các phương thức getset của Indexer, và ném ra ngoại lệ phù hợp (ví dụ: ArgumentOutOfRangeException) khi cần thiết.
  4. Hiệu suất: Indexer giúp mã nguồn trở nên dễ đọc và dễ sử dụng, nhưng trong các ứng dụng đòi hỏi hiệu suất cao, việc truy cập trực tiếp vào mảng hoặc tập hợp có thể nhanh hơn.

Bằng cách sử dụng Indexer, bạn có thể cung cấp cho lớp hoặc cấu trúc của mình khả năng truy cập giống mảng, giúp viết mã nguồn rõ ràng và tự nhiên hơn.

Thẻ: C# Indexer class lập trình Cấu trúc dữ liệu

Đăng vào ngày 20 tháng 7 lúc 02:42