Java'nın isInstance () ile C # eşdeğeri nedir?


Yanıtlar:


52

Java'nın obj.getClass().isInstance(otherObj)C # ' daki karşılığı aşağıdaki gibidir:

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

Hem Java hem de C # bir (via vs ) çalışma zamanı türü nesnesi (Java java.lang.Class≣ C # System.Type) üzerinde çalışırken , Java'nın bir nesneyi argüman olarak aldığını , C # 'ların ise başka bir nesne beklediğini unutmayın .obj.getClass().getType()isInstanceIsAssignableFromSystem.Type


1
Not IsAssignableFrom bir nesne değil bir Type alır, bu yüzden aslında OtherObj.getType () yapmanız gerekir.
— FlySwat

3
Teşekkürler Jon - ve unutmayın, bu bir wiki! İnsanların hatalarımı düzeltmesine kızmam.
— Konrad Rudolph

1
ilginç ... java'da, JVM "instanceof" u özel olarak ele alır, görünüşe göre çok hızlıdır, bu da neden alışılmadık bir anahtar kelime olduğunu açıklayabilir (java'da bir isAssignable yöntemi de vardır).
— Michael Neale

Bu yöntem neden daha okunaklı olan "eşittir" operatöründen daha iyidir?
— Timothy Gonzalez

@TimothyGonzalez Çünkü farklı bir şey yapıyor. İki değişkenin aynı türe sahip olup olmadığını test eder. isaksine bir tür adı gerektirdi. OP'nin istediği buydu: Java'nın eşdeğeri isInstance. Diğer cevap, gülünç sayıda olumlu oylara rağmen tamamen yanlış.
— Konrad Rudolph


39

Bağlıdır, isalçı sonucunu kullanmak istemiyorsanız kullanın ve kullanırsanız kullanın as. Neredeyse hiç yazmak istemezsin:

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

Onun yerine:

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

2

aklımın ucunda, şunları da yapabilirsiniz:

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

Hangisinin daha iyi performans göstereceğinden emin değilim. Bunu kıyaslama yapmak için başka birine bırakacağım :)


2

Aşağıdaki kod alternatif olabilir IsAssignableFrom.

parentObject.GetType().IsInstanceOfType(inheritedObject)

MSDN'de Type.IsInstanceOfType açıklamasına bakın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.