Cast vs. As/Is-Operator

C# ist ja eine stark typisierte Sprache (von dynamic in C# 4.0 abgesehen). Mit den “Generics” wurde der Bedarf der Typumwandlung auch sehr reduziert. Trotzdem gibt es immer wieder die Situation, in der man ein Objekt umwandeln muss. Zum Beispiel bei der Verwendung von Hashtables. In diesem Fall hat man 2 Möglichkeiten:

Verwendung des AS-Operators

object obj = Factory.GetObject();
var t = obj as MyType;
if (t != null)
{
    // work with t. It's a MyType
}
else
{
    // Report failure
}

Verwendung von Cast

object obj = Factory.GetObject();
try
{
    var t = (MyType)obj;
    // work with t. It's a MyType
}
catch (InvalidCastException)
{
    // Report failure
}

Ich denke es ist offensichtlich, dass die erste Variante übersichtlicher und damit wartbarer ist. Außerdem hat sie einen Geschwindigkeitsvorteil, wenn das Objekt nicht von dem entsprechenden Typ ist, da keine Exception geworfen wird.

Wichtig ist, dass nicht erst mit IS geprüft wird, da der IS-Operator intern auch eine Umwandlung durchführt. Besser ist es mit AS umzuwandeln und das Ergebnis auf NULL zu prüfen.

Wann kann nun der AS-Operator nicht verwendet werden? Der AS-Operator funktioniert nur mit Referenztypen und nicht mit Value-Typen. Folgende Zeile würde also nicht kompilieren:

object obj = Factory.GetObject();
var i = obj as int; // does not compile

Das Verhalten ist ganz klar, da ein Int ja nie NULL sein kann. Deshalb kann der AS-Operator nicht verwendet werden. Um nun keine Exceptions als Mittel des normalen Programmflusses zu verwenden, können wir den Is-Operator verwenden:

object obj = Factory.GetObject();
int i;
if (obj is int)
{
    i = (int)obj;
    // work with i. It's an int
}

Um zur Laufzeit herauszubekommen, von welchem Typ ein Objekt ist, muss man bei der Verwendung des IS-Operators vorsichtig sein. Er gibt WAHR für alle Typen zurück, die von dem entsprechenden Typ erben. Um einen konkreten Laufzeittyp zu finden ist es besser folgendes zu tun:

if (obj.GetType() == typeof(MyType))

Vermeiden Sie Typumwandlungen. Wenn es doch nötig ist, dann verwende AS für Referenztypen und IS in Verbindung mit einem Cast für Value-Typen.

Verwenden Sie IS mit Vorsicht. Ggf. ist es besser den Lauzeittyp direkt zu vergleichen.

Verwenden Sie Casts, wenn es um Typumwandlungen geht, bei denen Daten verloren gehen können oder Seiteneffekte entstehen können.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s