Wenn Sie sich für dieses Thema interessieren, möchten Sie wahrscheinlich auch wissen, was der Unterschied zwischen "as" - und "cast" -Operatoren ist: blogs.msdn.com/b/ericlippert/archive/2009/10/08/…
Eric Lippert
7
Möchten Sie die akzeptierte Antwort markieren? Es würde anderen helfen, nach einer ähnlichen Antwort zu suchen.
KMån
Antworten:
151
ist
Der isOperator prüft, ob ein Objekt in einen bestimmten Typ umgewandelt werden kann.
Beispiel:
if(someObject isStringBuilder)...
wie
Der asOperator versucht, ein Objekt in einen bestimmten Typ umzuwandeln, und gibt null zurück, wenn dies fehlschlägt.
Beispiel:
StringBuilder b = someObject asStringBuilder;if(b !=null)...
Auch verwandt:
Casting
Der Cast-Operator versucht, ein Objekt in einen bestimmten Typ umzuwandeln, und löst eine Ausnahme aus, wenn dies fehlschlägt.
Das ist nicht richtig. isprüft nicht, ob ein Objekt in einen bestimmten Typ umgewandelt werden kann. Eine Ganzzahl wird zu einer langen Geldstrafe, 10 is longist aber falsch.
Martin Smith
9
@MartinSmith: Sie verwechseln die Typkonvertierung mit dem Casting. Eine Ganzzahl kann in long konvertiert werden, sie kann jedoch nicht in long umgewandelt werden, da sie nicht long ist.
Guffa
2
Sie sagen mir, dass eine Ganzzahl nicht zu lange umgewandelt werden kann? Das (long)some_integerwird scheitern? Ich bin mir ziemlich sicher, dass wir beide wissen, dass das nicht stimmt, ohne es überhaupt auszuführen. Erklären Sie also bitte, was Sie meinen.
Martin Smith
12
@ MartinSmith: Sie verwechseln Casting immer noch mit Conversion. Sie wandeln keine Ganzzahl in eine Long-Zahl um, sondern konvertieren eine Ganzzahl in eine Long-Zahl. Obwohl sie dieselbe Syntax verwenden, werden Referenzen umgewandelt und Werte konvertiert.
Guffa
2
Hinweis zuis : " Beachten Sie, dass der Operator is nur Referenzkonvertierungen, Boxkonvertierungen und Unboxing-Konvertierungen berücksichtigt. Andere Konvertierungen, z. B. benutzerdefinierte Konvertierungen, werden nicht berücksichtigt. " (Msdn.microsoft.com/en-us/library/scekt9xw .aspx). Infoas : " Beachten Sie, dass der as- Operator nur Referenzkonvertierungen, nullfähige Konvertierungen und Boxkonvertierungen ausführt. Der as-Operator kann keine anderen Konvertierungen durchführen, z. B. benutzerdefinierte Konvertierungen, die stattdessen mithilfe von Cast-Ausdrücken ausgeführt werden sollten. " ( Msdn .microsoft.com / de-de / library / cscsdfbt.aspx )
user1234567
33
Der Unterschied zwischen IS und As ist das ..
IS - Is Operator wird verwendet, um die Kompatibilität eines Objekts mit einem bestimmten Typ zu überprüfen, und gibt das Ergebnis als Booleschen Wert (Richtig oder Falsch) zurück.
AS - As Operator wird zum Umwandeln eines Objekts in einen bestimmten Typ oder eine bestimmte Klasse verwendet.
Ex.
Student s = obj asStudent;
ist äquivalent zu:
Student s = obj isStudent?(Student)obj :(Student)null;
Die Äquivalenz zeigt deutlich, welche der beiden primitiver ist und liegt ihrer Beziehung elegant zugrunde! Danke für die Gleichwertigkeit!
Musa Al-hassy
1
@ MusaAl-hassy Eigentlich zeigt dies nicht, was primitiver ist. iskann ausgedrückt werden mit asund askann ausgedrückt werden mit is. Hier erfahren Sie, wie Sie ismit dem asSchlüsselwort eine erstellen. Bool b = obj is Student; ist gleichbedeutend mit: Bool b = (obj as Student) != null; Mehr dazu hier
Alex Telon
8
Sowohl isals auch asSchlüsselwörter werden für die Typumwandlung in C # verwendet.
Wenn Sie sich den IL-Verwendungscode beider Schlüsselwörter ansehen, werden Sie leicht den Unterschied feststellen.
C # -Code:
BaseClass baseclassInstance =newDerivedClass();DerivedClass derivedclassInstance;if(baseclassInstance isDerivedClass){
derivedclassInstance =(DerivedClass)baseclassInstance;// do something on derivedclassInstance}
derivedclassInstance = baseclassInstance asDerivedClass;if(derivedclassInstance !=null){// do something on derivedclassInstance}
IL-Code (der obige C # -Code befindet sich im angehängten Bild):
Der IL-Code für die isVerwendung von Schlüsselwörtern enthält sowohl IL-Anweisungen isinstaals auch castclass.
Der IL-Code für die asVerwendung von Schlüsselwörtern enthält jedoch nur isinsta.
Bei der oben genannten Verwendung werden zwei Typecasts durchgeführt, bei denen ein isSchlüsselwort verwendet wird, und nur ein Typecast, bei dem ein asSchlüsselwort verwendet wird.
Hinweis: Wenn Sie ein isSchlüsselwort verwenden, um eine Bedingung zu überprüfen, und kein Interesse am Typecast-Ergebnis haben, gibt es nur einen Typecast, d. H.
if(baseclassInstance isDerivedClass){// do something based on the condition check.}
isund asSchlüsselwörter werden je nach Notwendigkeit verwendet.
Das Schlüsselwort is prüft, ob der Wert auf der linken Seite eine Instanz des Typs auf der rechten Seite ist. Beispielsweise:
if(obj isstring){...}
Beachten Sie, dass Sie in diesem Fall eine zusätzliche explizite Umwandlung verwenden müssen, um obj als Zeichenfolge zu erhalten.
Das Schlüsselwort as wird verwendet, um nullfähige Typen umzuwandeln. Wenn der angegebene Wert keine Instanz des angegebenen Typs ist, wird null zurückgegeben. Beispielsweise:
+1 für "Das Schlüsselwort as wird verwendet, um nullfähige Typen umzuwandeln."
user2330678
3
Ich würde sagen: MSDN online lesen, aber hier ist es:
Der Operator is prüft, ob ein Objekt mit einem bestimmten Typ kompatibel ist, und das Ergebnis der Auswertung ist ein Boolescher Wert: true oder false.
Der as-Operator wird niemals eine Ausnahme auslösen.
Der Operator "as" löst auch keine Ausnahme aus, sondern gibt nur null zurück.
Pinte Dani
Der Tippfehler bezüglich 'ist' und 'als' wurde
Patrick Peters
2
Ist der Operator, eine Umwandlung, wird true zurückgegeben, wenn dies erfolgreich ist. Es wird false zurückgegeben, wenn die Umwandlung fehlschlägt. Damit können Sie die konvertierte Variable nicht erfassen. Dieser Operator ist am nützlichsten, wenn Sie Typen in if-Anweisungen und Ausdrücken prüfen. Die Umwandlung ist nur dann ideal, wenn die resultierende Variable für die weitere Verwendung nicht benötigt wird
Da ist eine Besetzung. Damit gewinnen wir an Leistung und vermeiden Ausnahmen, wenn eine Besetzung ungültig ist. Null wird zurückgegeben, wenn die Besetzung unmöglich ist. Für Referenztypen wird der As-Cast empfohlen. Es ist sowohl schnell als auch sicher. Wir können die resultierende Variable gegen Null testen und sie dann verwenden. Dies eliminiert zusätzliche Würfe
is OPERATOR
Der Operator is in C # wird zum Überprüfen des Objekttyps verwendet und gibt einen Bool-Wert zurück: true, wenn das Objekt vom gleichen Typ ist, und false, wenn nicht. oder auch Der Operator "is" wird verwendet, um zu überprüfen, ob der Laufzeittyp eines Objekts mit einem bestimmten Typ kompatibel ist oder nicht. Für Nullobjekte wird false zurückgegeben, z
if(obj isAnimalObject){//Then Work}
als BEDIENER
Der as-Operator erledigt die gleiche Aufgabe wie is operator, aber der Unterschied besteht darin, dass anstelle von bool das Objekt zurückgegeben wird, wenn sie mit diesem Typ kompatibel sind. Andernfalls wird null zurückgegeben. Mit anderen Worten, der Operator 'as' wird verwendet, um Konvertierungen zwischen kompatiblen Objekten durchzuführen Typen.
z.B
Type obj =ObjectasType;
Vorteile von as over is
Im Fall eines Operators müssen wir zum Eingeben von cast zwei Schritte ausführen:
Check the Type using isIf it’s true then Type cast
Tatsächlich wirkt sich dies auf die Leistung aus, da die CLR jedes Mal die Vererbungshierarchie durchläuft und jeden Basistyp mit dem angegebenen Typ vergleicht.
Um dies zu vermeiden, verwenden Sie as, um dies in einem Schritt zu tun. Nur zur Überprüfung des Typs sollten wir den Operator is verwenden.
Die Beantwortung von 8 Jahre alten Fragen, für die bereits viele gültige Antworten vorliegen, ist nicht der beste Weg, um den Stapelüberlauf zu verwenden.
Claus Jørgensen
1
Der As-Operator ähnelt einer Umwandlung, gibt jedoch null anstelle einer Ausnahme zurück, wenn dies fehlschlägt.
Mit dem Operator Is wird überprüft, ob ein Objekt mit einem bestimmten Typ kompatibel ist. Es wird normalerweise in If-Anweisungen verwendet.
Ihre Antwort ist korrekt, aber Ihr Beispielcode ist ein Anti-Pattern. isDann ist ases teuer : Es wird zweimal entpackt. Bei Referenztypen sollten Sie dies einfach tun asund dann auf null prüfen, um festzustellen, ob es funktioniert hat.
Steven Sudit
1
Schauen Sie sich das folgende Youtube-Video an, das den Unterschied auf anschaulichere und visuellere Weise erklärt: -
Das Schlüsselwort "IS" ist nützlich, um zu überprüfen, ob Objekte mit einem Typ kompatibel sind. Im folgenden Code prüfen wir beispielsweise, ob das Objekt "ocust" ein Typ der Klasse "Customer" ist.
object ocust =newCustomer();if(ocust isCustomer){
Das Schlüsselwort "AS" hilft bei der Konvertierung von einem Typ in einen anderen Typ. Zum Beispiel konvertieren wir im folgenden Code ein Objekt in einen String-Datentyp. Wenn das Schlüsselwort "AS" cast nicht eingeben kann, wird NULL zurückgegeben.
Sowohl IS als auch AS werden für das sichere Gießen verwendet
IS-Schlüsselwort -> prüft, ob der Typ eines bestimmten Objekts mit dem neuen Objekttyp kompatibel ist. Es wird nie eine Ausnahme ausgelöst. Dies ist ein boolescher Typ. Gibt entweder true oder false zurück
`student stud =new student(){}if(stud is student){}// It returns true // let say boys as derived classif(stud is boys){}// It returns false since stud is not boys type//this returns true when,
student stud =new boys()// this return true for both if conditions.`
AS-Schlüsselwort: Überprüft, ob der Typ eines bestimmten Objekts mit dem neuen Objekttyp kompatibel ist. Es gibt ungleich null zurück, wenn das angegebene Objekt mit dem neuen kompatibel ist, andernfalls null. Dies löst eine Ausnahme aus.
`student stud =new student(){}// let say boys as derived class
boys boy = stud as boys;//this returns null since we cant convert stud type from base class to derived class
student stud =new boys()
boys boy = stud as boys;// this returns not null since the obj is pointing to derived class`
Beide Bediener werden für sicheres Gießen verwendet.
AS-Betreiber:
Der AS-Operator prüft auch, ob der Typ eines bestimmten Objekts mit dem neuen Objekttyp kompatibel ist. Dieses Schlüsselwort prüft, ob der Typ eines bestimmten Objekts mit dem neuen Objekttyp kompatibel ist. Wenn es nicht mit dem neuen kompatibel ist, wird NULL zurückgegeben.
IS-Betreiber:
Dieser Operator prüft, ob der Typ eines Objekts mit dem neuen Objekt kompatibel ist. Wenn es kompatibel ist, gibt es true zurück, andernfalls false.
Antworten:
ist
Der
is
Operator prüft, ob ein Objekt in einen bestimmten Typ umgewandelt werden kann.Beispiel:
wie
Der
as
Operator versucht, ein Objekt in einen bestimmten Typ umzuwandeln, und gibt null zurück, wenn dies fehlschlägt.Beispiel:
Auch verwandt:
Casting
Der Cast-Operator versucht, ein Objekt in einen bestimmten Typ umzuwandeln, und löst eine Ausnahme aus, wenn dies fehlschlägt.
Beispiel:
quelle
is
prüft nicht, ob ein Objekt in einen bestimmten Typ umgewandelt werden kann. Eine Ganzzahl wird zu einer langen Geldstrafe,10 is long
ist aber falsch.(long)some_integer
wird scheitern? Ich bin mir ziemlich sicher, dass wir beide wissen, dass das nicht stimmt, ohne es überhaupt auszuführen. Erklären Sie also bitte, was Sie meinen.is
: " Beachten Sie, dass der Operator is nur Referenzkonvertierungen, Boxkonvertierungen und Unboxing-Konvertierungen berücksichtigt. Andere Konvertierungen, z. B. benutzerdefinierte Konvertierungen, werden nicht berücksichtigt. " (Msdn.microsoft.com/en-us/library/scekt9xw .aspx). Infoas
: " Beachten Sie, dass der as- Operator nur Referenzkonvertierungen, nullfähige Konvertierungen und Boxkonvertierungen ausführt. Der as-Operator kann keine anderen Konvertierungen durchführen, z. B. benutzerdefinierte Konvertierungen, die stattdessen mithilfe von Cast-Ausdrücken ausgeführt werden sollten. " ( Msdn .microsoft.com / de-de / library / cscsdfbt.aspx )Der Unterschied zwischen IS und As ist das ..
IS - Is Operator wird verwendet, um die Kompatibilität eines Objekts mit einem bestimmten Typ zu überprüfen, und gibt das Ergebnis als Booleschen Wert (Richtig oder Falsch) zurück.
AS - As Operator wird zum Umwandeln eines Objekts in einen bestimmten Typ oder eine bestimmte Klasse verwendet.
Ex.
ist äquivalent zu:
quelle
is
kann ausgedrückt werden mitas
undas
kann ausgedrückt werden mitis
. Hier erfahren Sie, wie Sieis
mit demas
Schlüsselwort eine erstellen.Bool b = obj is Student;
ist gleichbedeutend mit:Bool b = (obj as Student) != null;
Mehr dazu hierSowohl
is
als auchas
Schlüsselwörter werden für die Typumwandlung in C # verwendet.Wenn Sie sich den IL-Verwendungscode beider Schlüsselwörter ansehen, werden Sie leicht den Unterschied feststellen.
C # -Code:
IL-Code (der obige C # -Code befindet sich im angehängten Bild):
Der IL-Code für die
is
Verwendung von Schlüsselwörtern enthält sowohl IL-Anweisungenisinsta
als auchcastclass
.Der IL-Code für die
as
Verwendung von Schlüsselwörtern enthält jedoch nurisinsta
.Bei der oben genannten Verwendung werden zwei Typecasts durchgeführt, bei denen ein
is
Schlüsselwort verwendet wird, und nur ein Typecast, bei dem einas
Schlüsselwort verwendet wird.Hinweis: Wenn Sie ein
is
Schlüsselwort verwenden, um eine Bedingung zu überprüfen, und kein Interesse am Typecast-Ergebnis haben, gibt es nur einen Typecast, d. H.is
undas
Schlüsselwörter werden je nach Notwendigkeit verwendet.quelle
Das Schlüsselwort is prüft, ob der Wert auf der linken Seite eine Instanz des Typs auf der rechten Seite ist. Beispielsweise:
Beachten Sie, dass Sie in diesem Fall eine zusätzliche explizite Umwandlung verwenden müssen, um obj als Zeichenfolge zu erhalten.
Das Schlüsselwort as wird verwendet, um nullfähige Typen umzuwandeln. Wenn der angegebene Wert keine Instanz des angegebenen Typs ist, wird null zurückgegeben. Beispielsweise:
quelle
Ich würde sagen: MSDN online lesen, aber hier ist es:
Der Operator is prüft, ob ein Objekt mit einem bestimmten Typ kompatibel ist, und das Ergebnis der Auswertung ist ein Boolescher Wert: true oder false.
Der as-Operator wird niemals eine Ausnahme auslösen.
quelle
Ist der Operator, eine Umwandlung, wird true zurückgegeben, wenn dies erfolgreich ist. Es wird false zurückgegeben, wenn die Umwandlung fehlschlägt. Damit können Sie die konvertierte Variable nicht erfassen. Dieser Operator ist am nützlichsten, wenn Sie Typen in if-Anweisungen und Ausdrücken prüfen. Die Umwandlung ist nur dann ideal, wenn die resultierende Variable für die weitere Verwendung nicht benötigt wird
Da ist eine Besetzung. Damit gewinnen wir an Leistung und vermeiden Ausnahmen, wenn eine Besetzung ungültig ist. Null wird zurückgegeben, wenn die Besetzung unmöglich ist. Für Referenztypen wird der As-Cast empfohlen. Es ist sowohl schnell als auch sicher. Wir können die resultierende Variable gegen Null testen und sie dann verwenden. Dies eliminiert zusätzliche Würfe
quelle
quelle
is OPERATOR Der Operator is in C # wird zum Überprüfen des Objekttyps verwendet und gibt einen Bool-Wert zurück: true, wenn das Objekt vom gleichen Typ ist, und false, wenn nicht. oder auch Der Operator "is" wird verwendet, um zu überprüfen, ob der Laufzeittyp eines Objekts mit einem bestimmten Typ kompatibel ist oder nicht. Für Nullobjekte wird false zurückgegeben, z
als BEDIENER
Der as-Operator erledigt die gleiche Aufgabe wie is operator, aber der Unterschied besteht darin, dass anstelle von bool das Objekt zurückgegeben wird, wenn sie mit diesem Typ kompatibel sind. Andernfalls wird null zurückgegeben. Mit anderen Worten, der Operator 'as' wird verwendet, um Konvertierungen zwischen kompatiblen Objekten durchzuführen Typen.
z.B
Vorteile von as over is Im Fall eines Operators müssen wir zum Eingeben von cast zwei Schritte ausführen:
Tatsächlich wirkt sich dies auf die Leistung aus, da die CLR jedes Mal die Vererbungshierarchie durchläuft und jeden Basistyp mit dem angegebenen Typ vergleicht.
Um dies zu vermeiden, verwenden Sie as, um dies in einem Schritt zu tun. Nur zur Überprüfung des Typs sollten wir den Operator is verwenden.
quelle
Der As-Operator ähnelt einer Umwandlung, gibt jedoch null anstelle einer Ausnahme zurück, wenn dies fehlschlägt.
Mit dem Operator Is wird überprüft, ob ein Objekt mit einem bestimmten Typ kompatibel ist. Es wird normalerweise in If-Anweisungen verwendet.
quelle
is
: Mit dem Operator is wird geprüft, ob der Laufzeittyp eines Objekts mit einem bestimmten Typ kompatibel istas
: Mit dem Operator as werden Konvertierungen zwischen kompatiblen Typen durchgeführt.quelle
is
Dann istas
es teuer : Es wird zweimal entpackt. Bei Referenztypen sollten Sie dies einfach tunas
und dann auf null prüfen, um festzustellen, ob es funktioniert hat.Schauen Sie sich das folgende Youtube-Video an, das den Unterschied auf anschaulichere und visuellere Weise erklärt: -
https://www.youtube.com/watch?v=IKmRtJcRX_I
Unten folgt die lange Antwort mit Code-Erklärung.
Das Schlüsselwort "IS" ist nützlich, um zu überprüfen, ob Objekte mit einem Typ kompatibel sind. Im folgenden Code prüfen wir beispielsweise, ob das Objekt "ocust" ein Typ der Klasse "Customer" ist.
Das Schlüsselwort "AS" hilft bei der Konvertierung von einem Typ in einen anderen Typ. Zum Beispiel konvertieren wir im folgenden Code ein Objekt in einen String-Datentyp. Wenn das Schlüsselwort "AS" cast nicht eingeben kann, wird NULL zurückgegeben.
quelle
vs.
Die zweite Option gibt null zurück, wenn obj keine MyClass ist, anstatt eine Klassenumwandlungsausnahme auszulösen.
Dies wird nur wahr oder falsch zurückgeben
quelle
Sowohl IS als auch AS werden für das sichere Gießen verwendet
IS-Schlüsselwort -> prüft, ob der Typ eines bestimmten Objekts mit dem neuen Objekttyp kompatibel ist. Es wird nie eine Ausnahme ausgelöst. Dies ist ein boolescher Typ. Gibt entweder true oder false zurück
AS-Schlüsselwort: Überprüft, ob der Typ eines bestimmten Objekts mit dem neuen Objekttyp kompatibel ist. Es gibt ungleich null zurück, wenn das angegebene Objekt mit dem neuen kompatibel ist, andernfalls null. Dies löst eine Ausnahme aus.
quelle
Beide Bediener werden für sicheres Gießen verwendet.
AS-Betreiber:
Der AS-Operator prüft auch, ob der Typ eines bestimmten Objekts mit dem neuen Objekttyp kompatibel ist. Dieses Schlüsselwort prüft, ob der Typ eines bestimmten Objekts mit dem neuen Objekttyp kompatibel ist. Wenn es nicht mit dem neuen kompatibel ist, wird NULL zurückgegeben.
IS-Betreiber:
Dieser Operator prüft, ob der Typ eines Objekts mit dem neuen Objekt kompatibel ist. Wenn es kompatibel ist, gibt es true zurück, andernfalls false.
quelle