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 .

Konrad Rudolph
sumber
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
181
bool result = (obj is MyClass); // Better than using 'as'
Ana Betts
sumber
1
Apakah itu berfungsi bahkan untuk kelas yang menggunakan warisan? ( new Child() is Parent)
Tomáš Zato - Kembalikan Monica
1
diuji di sini, ini berfungsi untuk kelas yang warisan pengguna. Terima kasih sobat.
Guilherme Golfetto
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;
}
Robert Gowland
sumber
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 :)

CodingWithSpike
sumber
2

Kode di bawah ini bisa menjadi alternatif IsAssignableFrom.

parentObject.GetType().IsInstanceOfType(inheritedObject)

Lihat Deskripsi Type.IsInstanceOfType di MSDN.

Youngjae
sumber