Twoje zrozumienie jest prawdziwe. To brzmi jak próba mikrooptymalizacji. Powinieneś użyć normalnej obsady, gdy masz pewność co do typu. Oprócz generowania bardziej sensownego wyjątku, również szybko zawiedzie. Jeśli mylisz o swoim założeniu o rodzaju, program nie będzie natychmiast i będziesz mógł zobaczyć przyczynę awarii od razu, zamiast czekać na NullReferenceExceptionlub ArgumentNullExceptionlub nawet kiedyś logicznego błędu w przyszłości. Ogólnie rzecz biorąc, aswyrażenie, po którym nie następuje nullsprawdzenie, to zapach kodu.
Z drugiej strony, jeśli nie masz pewności co do rzutu, powinieneś użyć aszamiast normalnego rzutu owiniętego try-catchblokiem. Ponadto zaleca się użycie aszamiast kontroli typu, a następnie rzutowania. Zamiast:
if (x is SomeType)
((SomeType)x).SomeMethod();
który generuje isinstinstrukcję dla issłowa kluczowego i castclassinstrukcję dla obsady (skutecznie wykonując rzut dwukrotnie), powinieneś użyć:
var v = x as SomeType;
if (v != null)
v.SomeMethod();
To tylko generuje isinstinstrukcję. Pierwsza metoda ma potencjalną wadę w aplikacjach wielowątkowych, ponieważ warunek wyścigu może spowodować, że zmienna zmieni swój typ po ispomyślnym sprawdzeniu i nie powiedzie się na linii rzutowania. Druga metoda nie jest podatna na ten błąd.
Poniższe rozwiązanie nie jest zalecane do użycia w kodzie produkcyjnym. Jeśli naprawdę nie znosisz tak fundamentalnej konstrukcji w języku C #, możesz rozważyć przejście na VB lub inny język.
Jeśli ktoś desperacko nienawidzi składni obsady, może napisać metodę rozszerzenia naśladującą obsadę:
public static T To<T>(this object o) { // Name it as you like: As, Cast, To, ...
return (T)o;
}
i użyj ładnej składni [?]:
obj.To<SomeType>().SomeMethod()