Chỉ Mục Indexer trong C#
Chỉ Mục Indexer trong C#
C# Căn Bản |
Đôi khi chúng ta chúng ta mong muốn truy cập một tập hợp bên trong một lớp như thể bản thân lớp là một mảng. Ví dụ, giả sử chúng ta tạo một điều khiển kiểu ListBox tên là myListBox chứa một danh sách các chuỗi lưu trữ trong một mảng một chiều, một biến thành viên private myStrings. Một List Box chứa các thuộc tính thành viên và những phương thức và thêm vào đó mảng chứa các chuỗi của nó. Tuy nhiên, có thể thuận tiện hơn nếu có thể truy cập mảng ListBox với chỉ mục như thể ListBox là một mảng thật sự. Ví dụ, ta có thể truy cập đối tượng ListBox được tạo ra như sau:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; namespace Indexer1 { // Lop list text box class ListBoxText { // thuoc tinh la mot mang string[] Strings = new string[256]; int crt = 0; // khoi tao doi tuong listBoxText public ListBoxText(params string[] initialStrings) { foreach (string s in initialStrings) { Strings[crt++] = s; } } // Phuong thuc them mot phan tu vao doi tuong public void add(string theString) { if (crt >= Strings.Length) { Console.WriteLine("Bo nho bi day."); } else { Strings[crt++] = theString; } } // Thuc hien truy cap vao phan tu theo mang public string this[int index] { get { if (index < 0 && index > Strings.Length) { Console.WriteLine("Chi muc khong ton tai."); return null; } else { return Strings[index]; } } set { if (index >= crt) { Console.WriteLine("Chi muc khong ton tai."); } else { Strings[index] = value; } } } // Luong chuoi dang duoc luu tru public int getNumEntries() { return crt; } } class Program { static void Main(string[] args) { ListBoxText lbt = new ListBoxText("1.Ngo","2.Doan","3.Tinh"); lbt.add("4.KinhMon"); lbt.add("5.Hai Duong"); string test = "Ha Noi 5"; lbt[4] = test; for (int i = 0; i < lbt.getNumEntries(); i++) { Console.WriteLine(lbt[i]); } Console.ReadLine(); } } }
string theFirstString = myListBox[0];
string theLastString = myListBox[myListBox.Length - 1];
Bộ chỉ mục là một cơ chế cho phép các
thành phần client truy cập một tập hợp chứa bên trong một lớp bằng cách
sử dụng cú pháp giống như truy cập mảng ([]). Chỉ mục là một loại thuộc
tính đặc biệt và bao gồm các phương thức get() và set() để xác nhận
những hành vi của chúng.
Chúng ta có thể khai báo thuộc tính chỉ mục bên trong của lớp bằng cách sử dụng cú pháp như sau:
<kiểu dữ liệu> this [<kiểu dữ liệu> <đối mục>]
{ get; set; }
Kiểu trả về được quyết định bởi kiểu của
đối tượng được trả về bởi bộ chỉ mục, trong khi đó kiểu của đối mục được
xác định bởi kiểu của đối mục dùng để làm chỉ số vào trong tập hợp chứa
đối tượng đích. Mặc dù kiểu của chỉ mục thường dùng là các kiểu nguyên,
chúng ta cũng có thể dùng chỉ mục cho tập hợp bằng các kiểu dữ liệu
khác, như kiểu chuỗi. Chúng ta cũng có thể cung cấp bộ chỉ mục với nhiều
tham số để tạo ra mảng đa chiều.
Từ khóa this tham chiếu đến đối tượng
nơi mà chỉ mục xuất hiện. Như một thuộc tính bình thường, chúng ta cũng
có thể định nghĩa phương thức get() và set() để xác định đối tượng nào
trong mảng được yêu cầu truy cập hay thiết lập.
Ví dụ sau khai báo một điều khiển
ListBox, tên là ListBoxTest, đối tượng này chứa một mảng đơn giản
(myStrings) và một chỉ mục để truy cập nội dung của mảng.
Đối
với lập trình C++, bộ chỉ mục đưa ra giống như việc nạp chồng toán tử
chỉ mục ([]) trong ngôn ngữ C++. Toán tử chỉ mục không được nạp chồng
trong ngôn ngữ C#,và được thay thế bởi bộ chỉ mục.
Kết quả:
1.Ngo giá trị của lbt[0]
2.Doan giá trị của lbt[1]
3.Tinh giá trị của lbt[2]
4.Kinh Mon giá trị của lbt[3]
Ha Noi.5 giá trị của lbt[4]
Trong chương trình trên, đối tượng
ListBox lưu giữ một mảng các chuỗi myStrings và một biến thành viên ctr
đếm số chuỗi được chứa trong mảng myStrings.
Chúng ta khởi tạo một mảng tối đa 256 chuỗi như sau:
myStrings = new String[256];
Cú pháp của bộ chỉ mục cũng tương tự như những thuộc tính. Chúng có thể
có phương thức get() hay set() hay cả hai phương thức. Phương thức get()
được thực thi đầu tiên bằng cách kiểm tra giá trị biên của chỉ mục và
giả sử chỉ mục đòi hỏi hợp lệ, thì phương thức trả về giá trị đòi hỏi:
get
{
if (index < 0 || index >= myStrings.Length)
{
// xử lý chỉ mục sai
}
return myStrings[index];
}
Đối với phương thức set() thì đầu tiên nó sẽ kiểm trả xem chỉ mục của
đối tượng cần lấy có vượt quá số lượng của các đối tượng trong mảng hay
không. Nếu giá trị chỉ mục hợp lệ tức là tồn tại một đối tượng có chỉ
mục tương đương, phương thức sẽ bắt đầu thiết lập lại giá trị của đối
tượng này. Từ khóa value được sử dụng để tham chiếu đến tham số đưa vào
trong phép gán của thuộc tính:set
{
if ( index >= ctr)
{
// chỉ mục không tồn tại
}
}
Post a Comment