C#: das „as” Schlüsselwort zum Casten

C#: das „as” Schlüsselwort zum Casten

„as” ist neu. „as” ist sexy. „as” ist C#.

Oder so.

Abgesehen davon, daß es schön aussieht, sollte man genau darauf achten, was es bezweckt. Es gibt nämlich einen Unterschied zwischen dem „as”-Cast und dem klassischen Cast mit den runden Klammern.

Dieser ist auch schnell beschrieben: er liegt in der Art, wie ein fehlgeschlagener Cast gehandhabt wird.

as-Cast

„as” wirft keine Exception. Sollte der Cast fehlschlagen, so wird der Referenztyp auf null gesetzt. Das läßt sich auch schön nachprüfen:

1
2
bool b = true;
int a = b as int;

compiliert nicht, weil in int a kein Wert null geschrieben werden kann (da müßte man int? nehmen, int ist kein Referenztyp).

klassischer Cast

Im Gegensatz dazu funktioniert (compiliert) der folgende Cast

1
2
bool b = true;
int a = (int)b;

und das liegt daran, daß, sollte ein Typ nicht in den anderen umwandelbar sein, es hier zu einer Exception kommt. Diesen würde man also in den meisten Fällen in einen try..catch Block einschließen.

Der Unterschied

Wann also welche Variante benutzen?

Oft kann es sinnig sein, eine Exception verhindern zu wollen. Nur.. müssen wir dann auf null prüfen (wenn wir nicht unsere Typen genau kennen und wissen, daß der Cast unproblematisch ist). Die Exception hingegen ruft sich deutlicher in unsere Aufmerksamkeit. Das ist also der Vorteil dieser Variante.

Ferner ist ein fehlgeschlagener Cast besser zu detektieren, denn wir bekommen direkt die InvalidCastException. Diese besagt dann auch recht eindeutig, was genau wir gemacht haben, was nicht funktioniert hat. Im Gegensatz zum as-Cast, wo – wenn wir nicht auf null prüfen – wir nämlich später bei der Verwendung eine NullReferenceException erhalten, die erstmal nicht so aussagekräftig ist. Hier müssen wir auf die vorherige, fehlgeschlagene Operation rückschließen.

Wann welche Methode verwenden?

Man sollte also die verwendete Methode danach richten, was man vorhat, und wie man (eventuelle) Fehler abfangen möchte, da dies der eigentliche Unterschied zwischen den beiden Cast-Arten ist. Ferner scheidet „as” bei einfachen Fällen wie enum nach int aus, da diese Typen nicht mit null umgehen können.

Weiterführendes

Einen sehr guten Artikel zu dem Thema gibt es von Andrew Arnott hier.
Was genau beim Cast passiert, kann man untersuchen, wenn man die verschiedenen Varianten unter C++ anschaut. Dazu gibt es (u. a.) zwei Artikel:
auf MSDN sowie
Stackoverflow

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.