Ich würde gerne wissen, warum das passiert?
BEARBEITEN:
%Vor%Wenn ich die 'as' Schlüsselwortanweisung debugge, erhalte ich nie eine NULL-Referenz (Objekt wird immer richtig zugewiesen). Die Umwandlung () erzeugt jedoch Ausnahmen, es sei denn, sie enthält die Anweisung if.
EDIT: Nach ungefähr 15 Läufen durch die Klasse konnte ich eine Null bekommen. Es scheint so, als hätte es mehr Runs gebraucht, um eine Null zu finden, verglichen damit, wie schnell die () Cast eine Ausnahme fangen würde.
OLD: Wenn die Anweisung 'as' jedes Mal debuggt, wenn die Klasse die Breakpoint-Treffer ausführt, wird nie ein Nullwert ausgegeben.
Wenn in der '()' Anweisung innerhalb des if ein debug ist, wird jedes Mal, wenn der Unterbrechungspunkt ankommt, der Cast korrekt ausgeführt. Werid
// funktioniert immer und gibt ein gültiges Objekt in _page zurück _page = _httpContext.Handler als System.Web.UI.Page;
Das hat technisch nicht funktioniert. Wenn Sie bemerken, dass _page
null
ist. Es hat einfach keinen Fehler geworfen.
Der Operator as
wird verwendet, um der Anwendung zu sagen "Ich möchte, dass Sie versuchen, dies zu konvertieren. Es könnte nicht, und ich weiß das, also werfen Sie keine Ausnahme. Ich werde mich dementsprechend damit befassen."
Die ()
Umwandlung wird verwendet, um der Anwendung zu sagen: "Dieses Objekt wird auf diesen Typ umgewandelt. Wenn es etwas nicht stimmt, muss ich darüber Bescheid wissen."
Der Unterschied zwischen den beiden Umwandlungen (und wenn Sie sie verwenden sollten) ist, wenn Sie "denken", dass etwas in einen anderen Typ umgewandelt werden kann und wenn Sie "wissen", dass etwas in einen anderen Typ umgewandelt werden kann.
Hier ist ein Artikel von Eric Lippert zu dem Thema (geändert zu seinem Blog nicht erneut): Ссылка
Die Verwendung des as-Operators unterscheidet sich von a In C # auf drei wichtige Arten einbetten:
Es gibt null zurück, wenn die Variable Sie versuchen zu konvertieren ist nicht von der angeforderter Typ oder in seiner Vererbung Kette, anstatt zu werfen Ausnahme. Es kann nur angewendet werden auf Referenztypvariablen, die in konvertieren Referenztypen. Verwenden wie nicht benutzerdefinierte Konvertierungen ausführen, z als implizite oder explizite Konvertierung Operatoren, die Casting-Syntax wird machen. Es gibt tatsächlich zwei komplett verschiedene in IL definierte Operationen Diese behandeln diese beiden Schlüsselwörter (die Castclass und Isinst Anweisungen) - es ist nicht nur "syntaktischer Zucker" geschrieben von C #, um das anders zu machen Verhalten. Der as-Operator scheint zu etwas schneller in v1.0 und v1.1 von Microsofts CLR im Vergleich zum Casting (Auch in Fällen, in denen es keine gibt ungültige Casts, die stark würden geringere Wurfleistung durch Ausnahmen).
Ein Hauptunterschied zwischen der As-Besetzung und der Präfix-Besetzung ist, dass die Präfix-Besetzung eine Ausnahme auslöst, während die As-Besetzung nur Null zurückgibt.
Wenn Sie den Operator 'as' verwenden, gibt die Konvertierung null aus, wenn die Konvertierung fehlschlägt. Wenn Sie eine explizite Umwandlung durchführen, wird eine Ausnahme ausgelöst, wenn die Konvertierung fehlschlägt. In dieser Situation wird das 'as' down auf den richtigen Typ erwartet. Die explizite Konvertierung kann nicht auf den gewünschten Typ verschoben werden.
Als allgemeine Regel sollten Sie immer "as" verwenden, es sei denn, Sie benötigen die explizite Umwandlung (z. B. wenn Sie Werttypen konvertieren müssen).
Verwenden von as
TRIES, um das Objekt auf diesen spezifischen Typ zu transformieren, gibt jedoch null
bei einem Fehler zurück, anstatt eine Ausnahme auszulösen (während Casting nur die Ausnahme auslöst). Sind Sie sicher, dass das Objekt mit der as
-Klausel tatsächlich ein Nicht-Null-Objekt zurückgibt?
Das gleiche, was @Tejs antwortet, sagte. Eine fehlgeschlagene Konvertierung mit as
erzeugt null.
Ich werde jedoch sagen, dass er anders ist als er und als allgemeine Regel sollte man immer eine explizite Besetzung verwenden. Ich persönlich hätte lieber lieber eine Ausnahme bekommen, wo die Konvertierung fehlschlägt als auf einer anderen Seite eine (scheinbar) aus dem Nichts stammende Referenz-Ausnahme.
Eine gute Verwendung für den Operator as
besteht jedoch darin, Dinge aus einer Datenbank zu konvertieren und nicht nach System.DBNull
Wie andere Antworten angemerkt haben, läuft es darauf hinaus, dass "as" im Falle eines ungültigen Cast null zurückgibt, während ein expliziter Cast eine Ausnahme auslöst .
Die anderen Antworten haben eine Debatte darüber, ob man sich auf das eine oder andere lehnen sollte. Wenn Sie "as" verwenden möchten, müssen Sie sich irgendwann damit befassen, dass es ein Nullwert ist. Wenn Sie eine explizite Besetzung verwenden möchten, müssen Sie sich mit einer möglichen Ausnahme befassen. Je nach Anwendungsfall lehne ich mich dem einen oder anderen zu.
Ich neige dazu, die spezifische Besetzung zu verwenden, wenn ich weiß, dass die Besetzung funktioniert, aber der Compiler nicht, und eine Ausnahme auszulösen wäre in Ordnung (weil es ein Ausnahmefall ist). Aber wenn es eine legitime Chance gibt, dass der Cast ungültig ist, verwende ich lieber "as" und teste auf Null. Dadurch wird vermieden, dass die Ausnahme aufgefangen wird, die hässlicher ist und das Debugging schwieriger macht.