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 NullReferenceExceptionoder ArgumentNullExceptionoder sogar einen logischen Fehler irgendwann in der Zukunft. Im Allgemeinen ist ein asAusdruck, auf den nullirgendwo keine Prüfung folgt, ein Codegeruch.
Wenn Sie sich bei der Besetzung nicht sicher sind und erwarten, dass sie fehlschlägt, sollten Sie sie asanstelle einer normalen Besetzung verwenden, die mit einem try-catchBlock 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 isinstAnweisung für das isSchlüsselwort und eine castclassAnweisung 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 isinstAnweisung. 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 isPrü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()