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.