Gibt es zwingende Gründe gegen die Verwendung des C # -Schlüsselwortes "as"?

7

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?

    
Pwninstein 20.02.2009, 13:12
quelle

9 Antworten

12

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.

    
Jon Skeet 20.02.2009, 13:22
quelle
7

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

    
Otávio Décio 20.02.2009 13:14
quelle
6

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.

    
Anton Gogolev 20.02.2009 13:20
quelle
4

"as": gutes Zeug. benutze es die ganze Zeit.

Wenn Sie wirklich eine Alternative zum manuellen Vergleichen von Typen wünschen, versuchen Sie:

%Vor%

liest sich noch besser.

    
andleer 20.02.2009 13:17
quelle
4

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 .

    
Kent Boogaart 20.02.2009 13:18
quelle
2

Wenn Sie einen einfachen (nicht nullbaren) Werttyp wünschen, funktioniert das natürlich nicht, zB:

%Vor%

ist jedoch nicht gültig:

%Vor%

ist erlaubt.

    
Chris Ballard 20.02.2009 13:20
quelle
1

Nein, ich benutze es ziemlich oft. Damit können Sie InvalidCastException s sauber vermeiden.

Zum Beispiel:

%Vor%

im Gegensatz zu:

%Vor%     
Neil Barnwell 20.02.2009 13:17
quelle
1

"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

  • ausgeführt
  • funktioniert nicht für Referenz- & gt; -Wert

Edit: "as" ist definitiv schneller ( Ссылка )

Edit2: also im Grunde eine Geschwindigkeit vs Sicherheit Entscheidung

    
annakata 20.02.2009 13:17
quelle
1

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.

​​Wann "als" im Vergleich zu Casting

zu verwenden ist     
Brendan Enrick 20.02.2009 13:33
quelle

Tags und Links