Apa setara C # dengan isInstance () Java?


Jawaban:


52

Setara dengan Java obj.getClass().isInstance(otherObj)di C # adalah sebagai berikut:

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

Perhatikan bahwa meskipun Java dan C # bekerja pada objek tipe runtime (Java java.lang.Class≣ C # System.Type) dari sebuah obj(via .getClass()vs .getType()), Java isInstancemenggunakan objek sebagai argumennya, sedangkan C # IsAssignableFrommengharapkan System.Typeobjek lain .


1
Catatan IsAssignableFrom mengambil Type, bukan objek, jadi Anda perlu melakukan OtherObj.getType ().
— FlySwat

3
Terima kasih Jon - dan ingat, ini adalah wiki! Saya tidak membenci orang yang mengoreksi kesalahan saya.
— Konrad Rudolph

1
menarik ... di java, JVM memperlakukan "instanceof" secara khusus, tampaknya sangat sangat cepat, yang mungkin menjelaskan mengapa ini menjadi kata kunci yang tidak biasa (ada juga metode isAssignable di java).
— Michael Neale

Mengapa metode ini lebih baik daripada operator "ada" yang lebih mudah dibaca?
— Timothy Gonzalez

@TimothyGonzalez Karena melakukan sesuatu yang berbeda. Ini menguji apakah dua variabel memiliki tipe yang sama. isSebaliknya, diperlukan nama tipe. Inilah yang diinginkan OP: setara dengan Java isInstance. Jawaban lainnya salah meskipun jumlah upvote yang konyol.
— Konrad Rudolph


39

Tergantung, gunakan isjika Anda tidak ingin menggunakan hasil gips dan gunakan asjika Anda melakukannya. Anda hampir tidak pernah ingin menulis:

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

Dari pada:

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

2

di luar kepala saya, Anda juga bisa melakukan:

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

Tidak yakin mana yang berkinerja lebih baik. Saya akan menyerahkannya kepada orang lain untuk melakukan benchmark :)


2

Kode di bawah ini bisa menjadi alternatif IsAssignableFrom.

parentObject.GetType().IsInstanceOfType(inheritedObject)

Lihat Deskripsi Type.IsInstanceOfType di MSDN.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.