Warum funktioniert das "as" -Schlüsselwort, während das () -Schreiben nicht funktioniert?

7
%Vor%

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

    
Mausimo 30.04.2010, 19:43
quelle

9 Antworten

14
  

// 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): Ссылка

    
kemiller2002 30.04.2010, 19:46
quelle
7

Von hier aus:

  

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).

    
davek 30.04.2010 19:46
quelle
4

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.

    
Andrew Hubbs 30.04.2010 19:46
quelle
0

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).

    
Tejs 30.04.2010 19:45
quelle
0

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?

    
Pwninstein 30.04.2010 19:46
quelle
0

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

suchen zu wollen %Vor%     
Earlz 30.04.2010 19:46
quelle
0

Wie viele darauf hinweisen, gibt der Operator as in diesem Fall ein null zurück, wodurch das "Problem" vermieden, aber nicht wirklich "gearbeitet" wird.

Diese Seite hat eine gute Beschreibung der 3 Unterschiede zwischen as und Casting:

Ссылка

    
KevenK 30.04.2010 19:48
quelle
0

Eigentlich sollte genau das passieren. Die Cast ist fehlgeschlagen und hat geworfen und es ist ein Fehler aufgetreten, weil die Cast nicht gültig war. Die as wird standardmäßig auf Null zurückgesetzt, wenn die Umwandlung fehlschlägt.

    
Dinah 30.04.2010 19:48
quelle
0

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.

    
RationalGeek 30.04.2010 19:50
quelle

Tags und Links