Dein Verständnis ist wahr. Das klingt für mich nach einem Mikrooptimierungsversuch. Sie sollten eine normale Besetzung verwenden, wenn Sie sich des Typs sicher sind. Neben der Erzeugung einer vernünftigeren Ausnahme schlägt dies auch schnell fehl. Wenn Sie falsch über Ihre Annahme über die Art, wird Ihr Programm nicht sofort und Sie werden in der Lage sein , die Ursache des Fehlers zu sehen sofort , anstatt zu warten für eine NullReferenceException
oder ArgumentNullException
oder sogar einen logischen Fehler irgendwann in der Zukunft. Im Allgemeinen ist ein as
Ausdruck, auf den null
irgendwo keine Prüfung folgt, ein Codegeruch.
Wenn Sie sich bei der Besetzung nicht sicher sind und erwarten, dass sie fehlschlägt, sollten Sie sie as
anstelle einer normalen Besetzung verwenden, die mit einem try-catch
Block umwickelt ist . Darüber hinaus wird die Verwendung von as
über eine Typprüfung gefolgt von einer Besetzung empfohlen. Anstatt:
if (x is SomeType)
((SomeType)x).SomeMethod();
Verwenden Sie Folgendes, um eine isinst
Anweisung für das is
Schlüsselwort und eine castclass
Anweisung für die Besetzung zu generieren (wobei die Besetzung effektiv zweimal ausgeführt wird):
var v = x as SomeType;
if (v != null)
v.SomeMethod();
Dies erzeugt nur eine isinst
Anweisung. Die erstere Methode weist einen potenziellen Fehler in Multithread-Anwendungen auf, da eine Race-Bedingung dazu führen kann, dass die Variable ihren Typ ändert, nachdem die is
Prüfung erfolgreich war und an der Cast-Linie fehlschlägt. Die letztere Methode ist für diesen Fehler nicht anfällig.
Die folgende Lösung wird für die Verwendung im Produktionscode nicht empfohlen . Wenn Sie solch ein grundlegendes Konstrukt in C # wirklich hassen, können Sie in Betracht ziehen, zu VB oder einer anderen Sprache zu wechseln.
Falls jemand die Besetzungssyntax verzweifelt hasst, kann er eine Erweiterungsmethode schreiben, um die Besetzung nachzuahmen:
public static T To<T>(this object o) { // Name it as you like: As, Cast, To, ...
return (T)o;
}
und verwenden Sie eine ordentliche [?] Syntax:
obj.To<SomeType>().SomeMethod()