Một chỉ mục cho phép một đối tượng được lập các chỉ số như một mảng. Khi bạn xác định một chỉ mục cho một lớp, lớp này được xem như một mảng ảo. Sau đó bạn có thể truy cập vào các thể hiện của lớp này bằng cách sử dụng toán tử truy cập mảng ([]).
Cú pháp
Một chỉ mục một chiều có cú pháp như sau:
kiểu_phần_tử this[int index] { // The get accessor. get { // trả về giá trị được xác định bởi chỉ số } // The set accessor. set { // thiết lập các giá trị quy định bởi chỉ số }
Sử dụng chỉ mục
Khai báo về một hành động của một indexer tương tự như một properties,sử dụng get and set accessors cho việc xác định một chỉ mục. Tuy nhiên, property thì return hoặc set một thành viên dữ liệu cụ thể, trong khi chỉ mục get hoặc set một giá trị cụ thể từ các đối tượng. Nói cách khác, nó phá vỡ các dữ liệu mẫu thành các phần nhỏ hơn và thiết lập chỉ số từng phần tử, gets or sets từng phần.
Xác định một property liên quan đến việc cung cấp một tên property. Chỉ mục không được định nghĩa với tên, nhưng với từ khoá indexer, trong đó đề cập đến trường hợp cua đối tượng. Ví dụ dưới đây trình bày khái niệm trên:
using System; namespace IndexerApplication { class IndexedNames { private string[] namelist = new string[size]; //khai báo một mảng chuỗi static public int size = 10; public IndexedNames() { for (int i = 0; i < size; i++) namelist[i] = "Z"; } public string this[int index] { get { string tmp; if( index >= 0 && index <= size-1 ) { tmp = namelist[index]; } else { tmp = ""; } return ( tmp ); } set { if( index >= 0 && index <= size-1 ) { namelist[index] = value; } } } static void Main(string[] args) { IndexedNames names = new IndexedNames(); names[0] = "A"; names[1] = "B"; names[2] = "C"; names[3] = "D"; names[4] = "E"; names[5] = "F"; names[6] = "G"; for ( int i = 0; i < IndexedNames.size; i++ ) { Console.WriteLine(names[i]); } Console.ReadKey(); } } }
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra các kết quả như sau:
A B C D E F G Z Z Z
Overload chỉ mục
Chỉ mục có thể bị quá tải. Chỉ mục cũng có thể được khai báo với nhiều thông số và mỗi tham số có thể là một kiểu khác nhau. Nó không nhất thiết các chỉ số phải là số nguyên. C # cho phép chỉ mục có những loại khác, ví dụ, một chuỗi.
Ví dụ sau đây cho thấy việc quá tải chỉ mục:
using System; namespace IndexerApplication { class IndexedNames { private string[] namelist = new string[size]; static public int size = 10; public IndexedNames() { for (int i = 0; i < size; i++) { namelist[i] = "Z"; } } public string this[int index] { get { string tmp; if( index >= 0 && index <= size-1 ) { tmp = namelist[index]; } else { tmp = ""; } return ( tmp ); } set { if( index >= 0 && index <= size-1 ) { namelist[index] = value; } } } public int this[string name] { get { int index = 0; while(index < size) { if (namelist[index] == name) { return index; } index++; } return index; } } static void Main(string[] args) { IndexedNames names = new IndexedNames(); names[0] = "A"; names[1] = "B"; names[2] = "C"; names[3] = "D"; names[4] = "E"; names[5] = "F"; names[6] = "G"; // sử dụng chỉ mục đầu tiên với tham số int for (int i = 0; i < IndexedNames.size; i++) { Console.WriteLine(names[i]); } //sử dụng chỉ mục thứ 2 với tham số string Console.WriteLine(names["B"]); Console.ReadKey(); } } }
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra các kết quả như sau:
A B C D E F G Z Z Z 2
Chúc bạn thành công!