Indexer trong C# giúp lập chỉ mục cho đối tượng, ví dụ như một mảng. Khi bạn định nghĩa indexer cho một lớp, thì lớp này vận hành tương tự như một virtual array (mảng ảo). Sau đó, bạn có thể truy cập instance (sự thể hiện) của lớp này nhờ toán tử truy cập mảng trong C# là ([ ]).
Cú pháp Indexer
Trong C#, Indexer một chiều có cú pháp như dưới đây:
kiểu_phần_tử this[int index] { get { // trả về giá trị được xác định bởi index } set { // thiết lập giá trị được xác định bởi index } }
Sử dụng Indexer trong C#
Khai báo hành vi của Indexer cũng tương tự như khai báo thuộc tính. Bạn sử dụng get và set để định nghĩa một Indexer. Tuy nhiên, các thuộc tính trả về hoặc thiết lập một thành viên dữ liệu cụ thể, nhưng, Indexer trả về hoặc thiết lập một giá trị cụ thể từ instance của đối tượng. Nói cách khác, nó chia dữ liệu của instance thành các phần nhỏ hơn và đánh chỉ mục mỗi phần, lấy hoặc thiết lập mỗi phần.
Điểm khác biệt là, bạn cần cung cấp tên thuộc tính khi khai báo thuộc tính, còn Indexer cần tên, bạn chỉ cần từ khóa this để tham chiếu tới instance của đối tượng. Ví dụ sau đây minh họa cho điều này:
using System; namespace QTMCSharp { class IndexedNames { private string[] danhSachTen = new string[size]; static public int size = 10; public IndexedNames() { for (int i = 0; i < size; i++) danhSachTen[i] = "N. A."; } public string this[int index] { get { string tmp; if( index >= 0 && index <= size-1 ) { tmp = danhSachTen[index]; } else { tmp = ""; } return ( tmp ); } set { if( index >= 0 && index <= size-1 ) { danhSachTen[index] = value; } } } static void Main(string[] args) { IndexedNames names = new IndexedNames(); names[0] = "Anh"; names[1] = "Hoàng"; names[2] = "Hoa"; names[3] = "Thám"; names[4] = "Bình"; names[5] = "Định"; names[6] = "Vương"; for ( int i = 0; i < IndexedNames.size; i++ ) { Console.WriteLine(names[i]); } Console.ReadKey(); } } }
Biên dịch và chạy chương trình C# bên bạn sẽ có kết quả như sau:
Anh
Hoàng
Hoa
Thám
Bình
Định
Vương
N. A.
N. A.
N. A.
Nạp chồng Indexer trong C#
Indexer có thể được nạp chồng trong C#. Indexer cũng có thể được khai báo với nhiều tham số và mỗi tham số có thể là một kiểu khác nhau. Các Indexer không nhất thiết phải là số nguyên (integer). C# cho phép các chỉ mục có thể là các kiểu giá trị khác, ví dụ như string.
Ví dụ dưới đây sẽ minh họa cách nạp chồng Indexer trong C#:
using System; namespace IndexerApplication { class IndexedNames { private string[] danhSachTen = new string[size]; static public int size = 10; public IndexedNames() { for (int i = 0; i < size; i++) { danhSachTen[i] = "N. A."; } } public string this[int index] { get { string tmp; if( index >= 0 && index <= size-1 ) { tmp = danhSachTen[index]; } else { tmp = ""; } return ( tmp ); } set { if( index >= 0 && index <= size-1 ) { danhSachTen[index] = value; } } } public int this[string name] { get { int index = 0; while(index < size) { if (danhSachTen[index] == name) { return index; } index++; } return index; } } static void Main(string[] args) { IndexedNames names = new IndexedNames(); names[0] = "Anh"; names[1] = "Hoàng"; names[2] = "Hoa"; names[3] = "Thám"; names[4] = "Bình"; names[5] = "Định"; names[6] = "Vương"; //sử dụng indexer đầu tiên với tham số int for (int i = 0; i < IndexedNames.size; i++) { Console.WriteLine(names[i]); } //sử dụng indexer thứ 2 với tham số string Console.WriteLine(names["Vương"]); Console.ReadKey(); } } }
Chạy code bên trên ta sẽ nhận được kết quả như sau:
Anh
Hoàng
Hoa
Thám
Bình
Định
Vương
N. A.
N. A.
N. A.
6
Theo Tutorialspoint
Bài trước: Reflection trong C#
Bài tiếp: Delegate trong C#