Ich finde das mit dem folgenden:
%Vor%ist einfacher zu schreiben und zu verstehen als:
%Vor%Gibt es zwingende Gründe, nicht das erste Konstrukt zu verwenden?
Ich bevorzuge in den meisten Fällen Umwandlungen mit as
, weil normalerweise ein falscher Typ des Objekts einen Fehler anzeigt. Bugs sollten Ausnahmen verursachen IMO - und ein InvalidCastException
bei genau der Zeile, die den Cast durchführt, ist viel klarer als ein NullReferenceException
viel später im Code.
as
sollte verwendet werden, wenn es gültig und legal ist, dass ein Verweis auf ein Objekt des Typs übergeben wurde, den Sie nicht möchten. Diese Situation kommt auf, aber nicht so oft wie in meiner Erfahrung üblich.
Das Vergleichen von Typen mit GetType()
ist jedoch sehr selten die richtige Lösung - es ist nur dann sinnvoll, wenn Sie nach dem genauen Typ und nicht nach einem kompatiblen Typ suchen möchten.
Ich habe ein deutlich länger geschrieben antworten Sie über die Diskussion "Cast vs as" woanders.
Überhaupt nicht - es gibt Ihnen die Möglichkeit zu überprüfen, dass die Konvertierung (Cast) OK war. Wenn du es tust
%Vor%Sie erhalten möglicherweise eine Ausnahme, wenn die Umwandlung fehlschlägt.
Im Allgemeinen sind diese beiden Snippets nicht äquivalent. TreeViewItem i = sender as TreeViewItem
liefert ein korrektes Ergebnis, auch wenn sender
ein Ur-Enkel von TreeViewItem
ist, während sender.GetType() == typeof(TreeViewItem)
nur dann true
ist, wenn sender
genau% co_de ist % und keine seiner möglichen Unterklassen.
Ihr Beispiel wäre besser geschrieben als:
%Vor% Es ist genau diese doppelte Überprüfung, dass der as
-Operator helfen kann zu vermeiden. Also für Ihr genanntes Beispiel würde ich sagen, dass es definitiv eine gute Lösung ist.
Es gibt jedoch Situationen, in denen Sie wirklich eine Besetzung wünschen. Wenn Sie TreeViewItem
erwarten und nichts anderes möchten, sorgt das Casting dafür, dass InvalidCastException
ausgelöst wird, wenn Sie etwas anderes erhalten.
Wie in den meisten Situationen gibt es hier keine allgemeine Regel: Verwenden Sie das richtige Werkzeug für den richtigen Job .
Wenn Sie einen einfachen (nicht nullbaren) Werttyp wünschen, funktioniert das natürlich nicht, zB:
%Vor%ist jedoch nicht gültig:
%Vor%ist erlaubt.
Nein, ich benutze es ziemlich oft. Damit können Sie InvalidCastException
s sauber vermeiden.
Zum Beispiel:
%Vor%im Gegensatz zu:
%Vor%"as" ist schneller, aber zu beachten sind:
"as" gibt eine Null zurück, anstatt eine Ausnahme auszulösen, wenn das ein Problem ist
Es werden keine benutzerdefinierten Konvertierungen in
funktioniert nicht für Referenz- & gt; -Wert
Edit: "as" ist definitiv schneller ( Ссылка )
Edit2: also im Grunde eine Geschwindigkeit vs Sicherheit Entscheidung
Wenn ein falscher Typ ein Fehler ist, sollten Sie einen Cast verwenden. Der Grund dafür ist, dass es wirklich ein Problem gibt und Sie darüber Bescheid wissen sollten.
Wenn es möglich ist, dass der Wert Null ist und dies kein Fehler im System ist, dann benutze "as". Der Grund dafür ist, dass Sie "as" immer dann verwenden sollten, wenn ein Nullwert akzeptiert wird.
Beachten Sie, dass Sie "as" nicht verwenden können, um in Werttypen zu konvertieren, da der Nullwert für sie nicht akzeptabel ist. Wenn Sie einen Werttyp haben und "wie" verwenden möchten, müssen Sie einen Nullwerttyp verwenden.
zu verwenden istTags und Links .net c# types casting as-keyword