2010-05-24 36 views
6

Tôi muốn so sánh loại đối tượng với một kiểu để xem chúng có giống nhau hay không. Tôi không có đối tượng, chỉ là loại đối tượng.Toán tử "is" hoạt động như thế nào trong nội bộ

tôi có thể làm type1 == type2 và nhận được sự bình đẳng chung

tôi có thể có một vòng lặp đệ quy mà tôi lặp lại các bước trên cho đến khi type1.BaseType BaseType là null.

tôi có thể làm type1.GetInterface(type2.FullName) != null để kiểm tra xem type2 là một giao diện của type1

Nếu tôi đặt nó tất cả cùng nhau, tôi nhận được

if (type2.IsInterface) 
    return type1.GetInterface(type2.FullName) != null; 

while (type1 != null) { 
    if (type1 == type2) 
    return true; 

    type1 = type1.BaseType; 
} 
return false; 

Có phải đó là tất cả các từ khóa is là. Tôi không thể tìm thấy từ khóa đúng để cắm vào tìm kiếm Phản xạ để tìm hàm và tìm kiếm trên google "is" không thực sự hữu ích

+9

Điều đó phụ thuộc vào ý nghĩa của từ 'là' là –

+0

+1 thú vị. Tuy nhiên, tôi cho rằng từ khóa "is" được thực thi nguyên bản trong thời gian chạy và không sử dụng sự phản chiếu. – tster

+3

Tôi không bao giờ nghĩ rằng tôi muốn thấy một báo giá Bill Clinton có liên quan về SO. –

Trả lời

6

is (§14.9.10 của the standard) thường sử dụng isinst, nhưng không cần phải nếu loại thời gian biên dịch tương thích thông qua một số chuyển đổi nhất định.

Tương đương (ngược lại) với đối tượng Kiểu là IsAssignableFrom. Tất cả những điều này đều đúng:

"foo" is String; 
"foo" is object; 

typeof(String).IsAssignableFrom("foo".GetType()); 
typeof(object).IsAssignableFrom("foo".GetType()); 
+1

Hãy cẩn thận, lệnh 'isinst' không phải lúc nào cũng được tạo. Trình biên dịch C# có thể cho biết khi nào bạn đang câm và sẽ tạo ra các so sánh với null thay vì 'isinsts'. –

Các vấn đề liên quan