Qual è l'equivalente in C # di isInstance () di Java?


Risposte:


52

L'equivalente di Java obj.getClass().isInstance(otherObj)in C # è il seguente:

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

Si noti che mentre sia Java che C # funzionano sull'oggetto di tipo runtime (Java java.lang.Class≣ C # System.Type) di un obj(tramite .getClass()vs .getType()), Java isInstanceaccetta un oggetto come argomento, mentre C # si IsAssignableFromaspetta un altro System.Typeoggetto.


1
Nota IsAssignableFrom accetta un Type, non un oggetto, quindi è necessario eseguire effettivamente OtherObj.getType ().
FlySwat

3
Grazie Jon - e ricorda, questo è un wiki! Non mi risento le persone che correggono i miei errori.
Konrad Rudolph

1
interessante ... in java, la JVM tratta "instanceof" in modo speciale, apparentemente è molto molto veloce, il che potrebbe spiegare perché è insolitamente una parola chiave (c'è anche un metodo isAssignable in java).
Michael Neale

Perché questo metodo è migliore dell'operatore "is", che è più leggibile?
Timothy Gonzalez,

@TimothyGonzalez Perché fa qualcosa di diverso. Verifica se due variabili hanno lo stesso tipo. isrichiesto un nome di tipo, al contrario. Questo è ciò che voleva OP: l'equivalente di Java isInstance. L'altra risposta è semplicemente sbagliata nonostante il numero ridicolo di voti positivi.
Konrad Rudolph,


39

Dipende, usa isse non vuoi usare il risultato del cast e usa asse lo fai. Quasi mai vorresti scrivere:

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

Invece di:

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

2

appena sopra la mia testa, potresti anche fare:

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

Non sono sicuro di quale funzionerebbe meglio. Lascio a qualcun altro il benchmark :)


2

Il codice sottostante può essere alternativo a IsAssignableFrom.

parentObject.GetType().IsInstanceOfType(inheritedObject)

Vedere la descrizione di Type.IsInstanceOfType in MSDN.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.