Wie funktioniert das Schlüsselwort "as" intern?

8

Ich kenne die Funktion dieses Keywords, aber ich würde gerne wissen, wie es auf einer niedrigeren Ebene funktioniert.

Welcher ist schneller? Und bringen sie immer das gleiche Ergebnis? Wenn ja, warum gibt es zwei verschiedene Möglichkeiten?

%Vor%

oder

%Vor%     
Felipe Fujiy Pessoto 05.06.2009, 11:08
quelle

5 Antworten

16

Bei Verwendung des Schlüsselworts as findet kein interner Versuchserfolg statt. Soweit ich weiß, ist die Funktionalität in den Compiler / CLR integriert, so dass die Typprüfung implizit und automatisiert ist.

Einfache Regel :
Verwenden Sie eine direkte Umsetzung, wenn Sie immer erwarten, dass das Objekt einen bekannten Typ hat (und erhalten Sie daher einen hilfreichen Fehler, wenn zufällig vom falschen Typ ist). Verwenden Sie das Schlüsselwort as , wenn das Objekt immer von einem bekannten Typ ist.

Der Grund für das Vorhandensein des Schlüsselworts as liegt ausschließlich in der Bequemlichkeit des Programmierers (obwohl Sie zu Recht vermuten, dass ein try-catch langsamer wäre). Sie können es selbst manuell implementieren, wie Sie darauf hinweisen:

%Vor%

Dies unterstreicht die Tatsache, dass das "as" -Schlüsselwort primär zum Zweck der Prägnanz da ist.

Jetzt ist der Leistungsunterschied zwischen den beiden wahrscheinlich vernachlässigbar. Das as -Schlüsselwort ist wahrscheinlich geringfügig langsamer wegen der Typprüfung, aber dies ist unwahrscheinlich, Code in der überwiegenden Mehrheit der Situationen zu beeinflussen. Wie gesagt, eine vorzeitige Optimierung ist nie eine weise Sache. Benchmark, wenn Sie wirklich wollen, aber ich würde empfehlen, nur die Methode zu verwenden, die für Ihre Situation bequemer / geeigneter ist, und sich keine Sorgen über die Leistung überhaupt zu machen (oder später, wenn Sie unbedingt müssen).

    
Noldorin 05.06.2009, 11:10
quelle
22

Laut MSDN: as (C # -Referenz) :

  

Der as-Operator ist wie eine Cast-Operation. Wenn die Konvertierung jedoch nicht möglich ist, wird null zurückgegeben, anstatt eine Ausnahme auszulösen. Betrachten Sie den folgenden Ausdruck:

%Vor%
  

Dies entspricht dem folgenden Ausdruck, außer dass der Ausdruck nur einmal ausgewertet wird.

%Vor%

Die erste Variante ( als Operand ) ...

%Vor%

... kompiliert zu diesem IL-Code:

%Vor%

... und die zweite Variante ( ist operand + cast ) ...

%Vor%

... kompiliert zu diesem IL-Code:

%Vor%

... Sie sehen also, der einzige Unterschied ist der zusätzliche Code castclass in Zeile L_0038 .

    
ulrichb 05.06.2009 11:25
quelle
9

Um ein paar Dinge klarzustellen:

Geben Sie ein Casting ein, wenn Sie sicher sind, dass das Objekt vom Typ ist, den Sie erstellen. Es kann null sein (in diesem Fall wird null zurückgegeben, es sei denn, es handelt sich um einen Wertetyp, für den Sie ein Casting durchführen).

Wenn Sie nicht sicher sind, kann der Operator "as" verwendet werden. Wenn das Objekt nicht umgewandelt werden kann oder das Objekt null ist, wird null zurückgegeben.

Der Operator "as" wird in eine dedizierte IL-Anweisung ( isinst ) übersetzt, während eine Typumwandlung in die ILL-Anweisung Umsetzungsklasse umgesetzt wird, sodass sie in die Laufzeitumgebung integriert ist . Der Compiler gibt einfach die korrekte IL-Anweisung aus.

    
Philippe Leybaert 05.06.2009 11:29
quelle
5

kann schneller sein, weil der Typ nur einmal überprüft werden muss, während + cast den Typ zweimal überprüfen muss.

    
ggf31416 05.06.2009 11:13
quelle
5

Diese Frage wurde bereits gut beantwortet, bisher fehlten jedoch harte Zahlen.

%Vor%

Die Zahlen kommen immer wieder in diesen Proportionen zurück

Ich möchte darauf hinweisen, dass die einzige Schlussfolgerung aus diesen Zahlen darin besteht, dass es unter Leistungsperspektive sehr wenig zu gewinnen gibt, wenn man eine dieser Methoden gegenüber der anderen wählt . Es gibt einen sehr kleinen Unterschied für einen einzelnen Anruf (wobei sehr wenig zu Null tendiert). Das heißt, "wie" ist schneller:)

Danach sind die oben genannten Zahlen meist vernünftig.

"Bei" dauert länger als beim Erfolg. Bei Erfolg passiert nichts, der Wert kann unverändert verwendet oder einfach kopiert werden. Bei einem Fehler wird ein Sprung benötigt, um eine Nullreferenz zu kopieren.

"Cast" ist bei einem Fehler schneller, ein Aufruf an "ist" und es geht nicht mehr. Bei Erfolg ist es viel langsamer, es hat den Overhead des Aufrufs zu "ist" und dann die Besetzung.

Ich bin jedoch überrascht, dass der Cast-on-Fehler länger dauert als der AS-Fehler

Bearbeiten

Wie gewünscht, Zahlen für die Besetzung in einem Try / Catch-Block

%Vor%

Der Code, der den ersten Zahlensatz erzeugt hat

%Vor%     
Binary Worrier 05.06.2009 13:05
quelle

Tags und Links