2009-12-06 10 views
13

was den Unterschied sowie die Vor- und Nachteile zwischenObjekt Casting in C#

LinkButton lb = (LinkButton)ctl; 

und

LinkButton lb = ctl as LinkButton; 

ich den ersten versucht, mit und es gibt mir Fehler, dann habe ich versucht, der andere mit dem Schlüsselwort als, es funktioniert ganz gut.

Vielen Dank im Voraus.

+0

Habe das gesehen. Muss dupliziert werden. :) –

+0

mögliche Duplikate von [Direct Casting vs 'als' Operator?] (Http://stackoverflow.com/questions/132445/direct-casting-vs-as-operator) –

Antwort

15

Die erste ist eine explizite Besetzung, und die zweite ist eine Umwandlung. Wenn die Konvertierung für das Schlüsselwort as fehlschlägt, wird einfach null zurückgegeben, anstatt eine Ausnahme auszulösen.

Dies ist die Dokumentation für jeden:

Hinweis in der verknüpften Dokumentation oben, sie erklären die as Schlüsselwort nicht Conversions benutzerdefinierte unterstützt. +1 bis Zxpro :) Dies ist, was eine benutzerdefinierte Umwandlung ist:

User-Defined Conversions Tutorial

+2

Ich glaube, es ist auch ziemlich wichtig zu erwähnen, dass die 'as' -Operator führt keine benutzerdefinierte Konvertierung (implizit oder explizit) durch. –

5

Ich glaube, dass eine Ausnahme mit der ersten Methode Gießen wirft, wenn es nicht richtig, das Objekt werfen kann (versucht das werfen falscher Typ), während die Verwendung des as-Schlüsselworts die Variable einfach auf null setzt, wenn sie nicht richtig umgesetzt werden konnte.

So stellen Sie sicher, dass, wenn Sie das als Stichwort Besetzung verwenden, Sie

if(lb == null) 
    return null; // or throw new Exception() 

überprüfen und wenn Sie die() abgegeben verwenden, umgeben Sie es mit

try 
{ 
    LinkButton lb = (LinkButton)ctl; 
} 
catch(InvalidCastException ex) 
{ 
    //TODO: Handle Exception 
} 
+1

haha, Crow T Robot, ich liebe den Namen. – AaronLS

1

Die zweite genannt wird safe cast, die anstelle einer Ausnahme die Variable "null" setzt. So funktioniert es nicht in Ordnung, aber setzt Ihre LinkButton lb auf null

7

Meine übliche Anleitung zur Verwendung der as Betreiber im Vergleich zu einem direkten Guss ist wie folgt:

  1. Wenn die Besetzung erfolgreich sein muss (dh es wäre ein Fehler, fortzufahren, wenn die Besetzung fehlgeschlagen ist), verwenden Sie eine direkte Besetzung.
  2. Wenn der Cast möglicherweise fehlschlägt und eine programmatische Erkennung erforderlich ist, verwenden Sie den Operator as.

Das obige gilt für Referenztypen. Für Werttypen (wie bool oder int) funktioniert as nicht.In diesem Fall müssen Sie eine is Prüfung verwenden, um eine „sichere cast“ zu tun, wie folgt aus:

int y; 
if (x is int) 
{ 
    y = (int)x; 
} 
else 
{ 
    // ... 
} 

Ich versuche nicht, empfehlen InvalidCastException zu fangen, wie dies in der Regel das Zeichen eines Programmierfehlers ist. Verwenden Sie stattdessen die Anleitung oben.