Unterschied zwischen ist und als Schlüsselwort

121

Bitte sagen Sie, was der Unterschied zwischen isund asSchlüsselwort in C # ist

Ein Mann
quelle
7
Ist ist wie oder ist wie ist? blogs.msdn.com/b/ericlippert/archive/2010/09/16/…
LukeH
3
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 is StringBuilder) ...

wie

Der asOperator versucht, ein Objekt in einen bestimmten Typ umzuwandeln, und gibt null zurück, wenn dies fehlschlägt.

Beispiel:

StringBuilder b = someObject as StringBuilder;
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.

Beispiel:

StringBuilder b = (StringBuilder)someObject.
Guffa
quelle
4
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 as Student;

ist äquivalent zu:

Student s = obj is Student ? (Student)obj : (Student)null;
Prem Ranjan Jha
quelle
1
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 = new DerivedClass();
DerivedClass derivedclassInstance;

if (baseclassInstance is DerivedClass)
{
   derivedclassInstance = (DerivedClass)baseclassInstance;
   // do something on derivedclassInstance
}


derivedclassInstance = baseclassInstance as DerivedClass;

if (derivedclassInstance != null)
{
   // do something on derivedclassInstance
}

IL-Code (der obige C # -Code befindet sich im angehängten Bild):

IL-Code für den obigen C # -Code 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 is DerivedClass)
{
   // do something based on the condition check.
}

isund asSchlüsselwörter werden je nach Notwendigkeit verwendet.

Abhilash NK
quelle
6

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 is string)
{
     ...
}

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:

string str = obj as string;
if(str != null)
{
     ...
}
ShdNx
quelle
+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.

Patrick Peters
quelle
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

Pankaj Ikhar
quelle
2

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 is AnimalObject)
{
 //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 = Object as Type;

Vorteile von as over is Im Fall eines Operators müssen wir zum Eingeben von cast zwei Schritte ausführen:

Check the Type using is
If its 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.

Faizan Butt
quelle
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.

Harry
quelle
1

is: Mit dem Operator is wird geprüft, ob der Laufzeittyp eines Objekts mit einem bestimmten Typ kompatibel ist

as: Mit dem Operator as werden Konvertierungen zwischen kompatiblen Typen durchgeführt.

object s = "this is a test";
string str=string.Empty;
if( s is string)
    str = s as string;
KMån
quelle
2
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: -

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.

object ocust = new Customer();

if (ocust is Customer)
{ 

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.

object o = "somestring";
string str = o as string;
Shivprasad Koirala
quelle
1
MyClass myObject = (MyClass) obj;

vs.

MyClass myObject = obj as MyClass;

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

vzades
quelle
1

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 class
if(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`
Sandeep Reddy
quelle
1

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.

Tukaram
quelle
Glaubst du nicht, es ist ein bisschen zu spät wie 4 Jahre?
Soner Gönül
Ohh ja ... Entschuldigung .... Ich bin neu im Stackoverflow, so dass wenig aufgeregt ... Ich habe das Datum nicht bemerkt ...
Tukaram
Ein Beitrag ist ein Beitrag! Vielen Dank für den Hinweis auf die Schlüsselwörter "Safe Typecasting"! :-)
Musa Al-hassy