Bộ lập chỉ mục :
Indexer không phải là một phần quan trọng của lập trình hướng đối tượng. Nhưng chúng
mô tả cú pháp tiện lợi cho phép các lớp được sử dụng trực quan hơn. Chúng cho phép
bạn truy cập đến một đối tượng nếu nó là một mảng.
Thêm một Indexer vào vector :
Chúng ta tiếp tục sử dụng struct Vector ở trên để mô tả cách sử dụng Indexer. Để tham
khả
o đến các thành phần của struct vector với tên x,y,z. Và sự cố là các nhà toán học
thường thích xem vector như là mảng với x là phần tử đầu, y là phần tử thứ hai và z là
phần tử thứ ba. Và để gán giá trị cho x ta thường làm như sau:
MyVector[0] = 3.6;
Nếu xem vector như là mảng chúng ta thường có thể thực hiện các thao tác như lập lại:
for(int i = 0; i < 3; i++)
{
vect2[i] = i;
}
Với sự định nghĩa vector như hiện tại thì đoạn mã này sẽ tạo ra một lỗi nhỏ trong thời
gian biên dịch, vì trình biên dịch không hiểu cái nào là phần tử đầu tiên của vector. Chính
vì thế indexer sẽ giải quyết vấn đề này. Indexer được định nghĩa như các thuộc tính với
các bộ truy nhập get và set. Điểm khác nhau chính đó là tên của indexer là từ khoá this.
Để định nghĩa một indexer cho m
ột struct vector ta làm như sau:
struct Vector
{
public double x, y, z;
public double this [int i]
{
get
{
switch (i)
{
case 0:
return x;
case 1:
return y;
case 2:
return z;
default:
throw new IndexOutOfRangeException(
"Attempt to retrieve Vector element " + i) ;
}
}
set
{
switch (i)
{
case 0:
x = value;
break;
case 1:
y = value;
break;
case 2:
z = value;
break;
default:
throw new IndexOutOfRangeException(
"Attempt to set Vector element " + i);
}
}
}
// etc.
Một điểm mới trong đoạn mã trên là khai báo một indexer:
public double this [int i]
Dòng này có nghĩa chúng ta xem mọi thể hiện vector như là một mảng với chỉ mục kiểu
int và trả về kiểu của phần tử là double.
Bên trong phần thân của indexer, chúng ta có cùng bộ truy nhập get và set. Nếu bạn
muốn tạo indexer mang tính chỉ đọc hay chỉ ghi thì bạn có thể bỏ bộ truy nhập thích hợp.
Bộ truy nhập get trả về ki
ểu đã khai báo trên indexer, set thì không trả về giá trị nào cả và
nó truy cập đến một tham số tường minh, value.
Bây giờ chúng ta thêm vào indexer của chúng ta như sau:
static void Main()
{
Vector vect1 = new Vector(1.0, -5.0, 4.6);
Vector vect2 = new Vector();
Console.WriteLine("vect1 = " + vect1);
Console.WriteLine("vect1[1] = " + vect1[1]);
for(int i = 0; i < 3; i++)
{
vect2[i] = i;
}
Console.WriteLine("vect2 = " + vect2);
Ví dụ này việc sử dụng một vòng lặp tạo chỉ mục cho các thành phần của vector. Kết quả
xuất ra là:
VectorWithIndexer
vect1 = ( 1 , -5 , 4.6 )
vect1[1] = -5
vect2 = ( 0 , 1 , 2 )
Thực thi chương trình trên
.
Với sự định nghĩa vector như hiện tại thì đoạn mã này sẽ tạo ra một lỗi nhỏ trong thời
gian biên dịch, vì trình biên dịch không hiểu cái nào là phần tử. "Attempt to set Vector element " + i);
}
}
}
// etc.
Một điểm mới trong đoạn mã trên là khai báo một indexer:
public double this [int i]
Dòng