Toán tử is

Một phần của tài liệu Tài Liệu Học Ngôn Ngữ Lập Trình C#_p5 pptx (Trang 28 - 31)

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ụ 8.3 minh họa việc sử dụng toán tử isđể kiểm tra Document có thực thi giao diện IStorable hay

ICompressible.  Ví dụ 8.3: Sử dụng toán tử is. --- using System; interface IStorable { void Read();

void Write(object obj); int Status { get; set; } }

interface ICompressible {

void Compress(); void Decompress(); }

// Document thực thi IStorable public class Document : IStorable {

public Document( string s) {

Console.WriteLine(“Creating document with: {0}”, s); }

// IStorable public void Read() {

Console.WriteLine(“Implementing the Read Method for IStorable”); }

// IStorable.WriteLine() public void Write( object o) {

Console.WriteLine(“Implementing the Write Method for IStorable”); }

// IStorable.Status public int Status { get { return status; } set { status = value; } }

// bien thanh vien luu gia tri cua thuoc tinh Status private int status = 0;

}

{

static void Main() {

Document doc = new Document(“Test Document”); // chỉ gán khi an toàn

if ( doc is IStorable ) {

IStorable isDoc = (IStorable) doc; isDoc.Read();

}

// việc kiểm tra này sẽ sai if ( doc is ICompressible ) {

ICompressible icDoc = (ICompressible) doc; icDoc.Compress();

} } } }

---

Trong ví dụ 8.3, 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

IL_0028: brfalse.s

ICompressible

IL_0039 IL_002a: ldloc.0 IL_002a: ldloc.0

IL_002b: castclass ICompressible IL_0030: stloc.2

IL_0031: ldloc.2 IL_0032: callvirt IL_0037: br.s IL_0039: ldstr

instance void ICompressible::Compress() IL_0043

“Compressible not supported”

Điều quan trọng xảy ra là khi phép kiểm tra ICompressible ở dòng 23. 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 (doc) đúng kiểu của kiểu bên

phải. Thì chương trình sẽ chuyển đến dòng lệnh 2b để 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

Một phần của tài liệu Tài Liệu Học Ngôn Ngữ Lập Trình C#_p5 pptx (Trang 28 - 31)

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

(40 trang)