C # tương đương với isInstance () của Java là gì?


Câu trả lời:


52

Tương đương với Java obj.getClass().isInstance(otherObj)trong C # như sau:

bool result = obj.GetType().IsAssignableFrom(otherObj.GetType());

Lưu ý rằng trong khi cả Java và C # đều hoạt động trên đối tượng kiểu thời gian chạy (Java java.lang.Class≣ C # System.Type) của một obj(qua .getClass()vs .getType()), Java isInstancelấy một đối tượng làm đối số của nó, trong khi C # lại IsAssignableFrommong đợi một System.Typeđối tượng khác .


1
Lưu ý IsAssignableFrom nhận một Loại, không phải một đối tượng, vì vậy bạn thực sự cần thực hiện OtherObj.getType ().
FlySwat

3
Cảm ơn Jon - và hãy nhớ, đây là wiki! Tôi không bực bội khi mọi người sửa lỗi cho tôi.
Konrad Rudolph

1
thú vị ... trong java, JVM xử lý "instanceof" một cách đặc biệt, rõ ràng là nó rất nhanh, điều này có thể giải thích tại sao một từ khóa bất thường của nó (cũng có một phương thức isAssignable trong java).
Michael Neale

Tại sao phương pháp này tốt hơn khi toán tử "is" dễ đọc hơn?
Timothy Gonzalez

@TimothyGonzalez Bởi vì nó làm điều gì đó khác biệt. Nó kiểm tra xem hai biến có cùng kiểu hay không. isngược lại, yêu cầu một tên loại. Đây là những gì OP muốn: tương đương với Java isInstance. Câu trả lời khác chỉ đơn giản là sai mặc dù số lượng ủng hộ vô lý.
Konrad Rudolph

181
bool result = (obj is MyClass); // Better than using 'as'

1
Nó có hoạt động ngay cả đối với các lớp sử dụng kế thừa không? ( new Child() is Parent)
Tomáš Zato - Phục hồi Monica

1
được thử nghiệm ở đây, nó hoạt động cho các lớp mà người dùng kế thừa. Cảm ơn anh bạn.
Guilherme Golfetto

39

Tùy, sử dụng isnếu bạn không muốn sử dụng kết quả của việc đúc và sử dụng asnếu bạn làm. Bạn hầu như không bao giờ muốn viết:

if(foo is Bar) {
    return (Bar)foo;
}

Thay vì:

var bar = foo as Bar;
if(bar != null) {
    return bar;
}

2

chỉ cần ra khỏi đỉnh đầu của tôi, bạn cũng có thể làm:

bool result = ((obj as MyClass) != null)

Không chắc cái nào sẽ hoạt động tốt hơn. Tôi sẽ giao nó cho người khác để đánh giá :)


2

Mã dưới đây có thể được thay thế cho IsAssignableFrom.

parentObject.GetType().IsInstanceOfType(inheritedObject)

Xem mô tả Type.IsInstanceOfType trong MSDN.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.