Toán tử is

Một phần của tài liệu Lập trình hướng đối tượng với C docx (Trang 116 - 118)

Chúng ta muốn kiểm tra một đối tượng xem nó có hỗ trợ giao diện, để sau đó thực hiện các phương thức tương ứng. Trong ngôn ngữ C# có hai cách để thực hiện điều này. Phương pháp đầu tiên là sử dụng toán tử is.

Cú pháp của toán tử is là:

<biểu thức> is <kiểu dữ liệu>

Toán tử is trả về giá trị true nếu biểu thức thường là kiểu tham chiếu có thể được gán an toàn đến kiểu dữ liệu cần kiểm tra mà không phát sinh ra bất cứ ngoại lệ nào.

Ví dụ 4.2 minh họa việc sử dụng toán tử is để kiểm tra HinhTron có thực thi giao diện Ihinh hay không

class Chay {

static void Main() {

HinhTron h = new HinhTron(4, 7, 4);

// Phép gán này không an toàn có thể gây lỗi cho chương trình nếu lớp HinhTron //không thực thi giao diện IHinh

IHinh hinh1 = (IHinh)h; if (h is IHinh)

{

IHinh hinh = (IHinh)h; // Phép gán này an toàn hinh.InThongTin();

Console.WriteLine("Hinh thuc thi IHinh"); } else h.InThongTin(); Console.Read(); } }

Trong ví dụ 4.2, hàm Main() lúc này sẽ thực hiện việc gán với interface khi được kiểm tra hợp lệ. Việc kiểm tra này được thực hiện bởi câu lệnh if:

if ( doc is IStorable )

Biểu thức điều kiện sẽ trả về giá trị true và phép gán sẽ được thực hiện khi đối tượng có thực thi giao diện bên phải của toán tử is.

Tuy nhiên, việc sử dụng toán tử is đưa ra một việc không có hiệu quả. Để hiểu được điều này, chúng ta xem đoạn chương trình được biên dịch ra mã IL. Ở đây sẽ có một ngoại lệ nhỏ, các dòng bên dưới là sử dụng hệ thập lục phân:

IL_0023: isinst IHinh

IL_0028: brfalse.s IL_0039

IL_002a: ldloc.0

IL_0030: stloc.2

IL_0031: ldloc.2

IL_0032: callvirt instance void IHinh::InThongTin()

IL_0037: br.s IL_0043

IL_0039: ldstr “Compressible not supported”

Điều quan trọng xảy ra là khi phép kiểm tra IHinh ở dòng ” if (h is IHinh)

”. Từ khóa isinst là mã MSIL tương ứng với toán tử is. Nếu việc kiểm tra đối tượng (h) đúng kiểu của kiểu bên phải. Thì chương trình sẽ chuyển đến dòng lệnh tiếp theo để thực hiện tiếp và castclass được gọi. Điều không may là castcall cũng kiểm tra kiểu của đối tượng. Do đó việc kiểm tra sẽ được thực hiện hai lần. Giải pháp hiệu quả hơn là việc sử dụng toán tử as.

Một phần của tài liệu Lập trình hướng đối tượng với C docx (Trang 116 - 118)

Tải bản đầy đủ (PDF)

(142 trang)