Từ 1 tới 4 trên tổng số 4 kết quả

Đề tài: Is-As ?

  1. #1
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Red face Is-As ?

    Có 2 cách check một class có implement một interface hay không : từ khóa is và từ khóa as. Trong sách nói dùng as thuận tiện hơn là dùng is bằng cách so sánh mã IL sinh ra.

    Mã IL đối với is:

    IL_0023: isinst ICompressible
    IL_0028: brfalse.s IL_0039
    IL_002a: ldloc.0
    IL_002b: castclass ICompressible
    IL_0030: stloc.2
    IL_0031: ldloc.2
    IL_0032: callvirt instance void ICompressible::Compress( )
    IL_0037: br.s IL_0043
    IL_0039: ldstr "Compressible not supported"
    Mã IL đối với as:

    IL_0023: isinst ICompressible
    IL_0028: stloc.2
    IL_0029: ldloc.2
    IL_002a: brfalse.s IL_0034
    IL_002c: ldloc.2
    IL_002d: callvirt instance void ICompressible::Compress( )
    Có bác nào ý kiến về vụ này không . Thuận tiện hơn chỗ nào ? Mình thấy chỉ có hơn mỗi cái dòng :

    IL_002b: castclass ICompressible
    Keep moving forward!

    ... Retired ...

  2. #2
    Ngày gia nhập
    09 2006
    Bài viết
    711

    nhc build debug và debug code JIT ASM của nó xem castclass làm gì, hay dùng PEBrowseDbg cũng được.

  3. #3
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Đúng là sách Tiếng Việt, chữ "efficient" (hiệu quả) mà nó dám dịch là thuận tiện. Thật là bó tay. Đoạn code trên có thể được hiểu như thế này:

    IL_0023: isinst ICompressible // toán tử is (mã IL là isinst) test class có implement interface ICompressible hay không
    IL_0028: brfalse.s IL_0039 // nếu false thì đến IL_0039
    IL_002a: ldloc.0
    IL_002b: castclass ICompressible // ép kiểu về interface ICompressible, đồng thời trong castclass cũng test kiểu một lần nữa => quá trình test bị lặp 2 lần => không hiệu quả
    IL_0030: stloc.2
    IL_0031: ldloc.2
    IL_0032: callvirt instance void ICompressible::Compress( )
    IL_0037: br.s IL_0043
    IL_0039: ldstr "Compressible not supported"
    Khúc này y chang trong cuốn "Programming C#, 2nd Edition" của OReilly. Thiệt tình dịch ra mà không chịu để dùm tên tài liệu tham khảo :(

    nhc build debug và debug code JIT ASM của nó xem castclass làm gì, hay dùng PEBrowseDbg cũng được.
    Uhm, cám ơn anh. Khi nào rảnh thì em sẽ coi lại
    Đã được chỉnh sửa lần cuối bởi nhc1987 : 28-10-2007 lúc 01:54 AM.
    Keep moving forward!

    ... Retired ...

  4. #4
    Ngày gia nhập
    09 2007
    Bài viết
    17

    Toán tử is: đơn giản dùng nó để kiểm tra xem 1 đối tượng nào đó có thuộc 1 kiểu dữ liệu (trị lẫn tham chiếu) nào đó.
    Toán tử as: có cùng chức năng như is, nhưng có thêm chức năng ép kiểu

    Mời mọi người xem ví dụ được lấy từ MSDN sau:
    Code:
    // cs_keyword_as.cs
    // The as operator
    using System;
    class MyClass1 
    {
    }
    
    class MyClass2 
    {
    }
    
    public class IsTest 
    {
       public static void Main() 
       {
          object [] myObjects = new object[6];
          myObjects[0] = new MyClass1();
          myObjects[1] = new MyClass2();
          myObjects[2] = "hello";
          myObjects[3] = 123;
          myObjects[4] = 123.4;
          myObjects[5] = null;
    
          for (int i=0; i<myObjects.Length; ++i) 
          {
             string s = myObjects[i] as string;
             Console.Write ("{0}:", i);
             if (s != null)
                Console.WriteLine ( "'" + s + "'" );
             else
                Console.WriteLine ( "not a string" );
          }
       }
    }
    Và đây là kết quả:
    PHP Code:
    0:not a string
    1
    :not a string
    2
    :'hello'
    3:not a string
    4
    :not a string
    5
    :not a string 
    Chắc hẳn qua ví dụ trên, mọi người sẽ phân biệt được khi nào sử dụng is, khi nào sử dụng as
    AI NÂNG MÌNH LÊN SẼ BỊ HẠ XUỐNG VÀ AI HẠ MÌNH XUỐNG SẼ ĐƯỢC NÂNG LÊN


Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn