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 NullReferenceException
lub ArgumentNullException
lub nawet kiedyś logicznego błędu w przyszłości. Ogólnie rzecz biorąc, as
wyrażenie, po którym nie następuje null
sprawdzenie, to zapach kodu.
Z drugiej strony, jeśli nie masz pewności co do rzutu, powinieneś użyć as
zamiast normalnego rzutu owiniętego try-catch
blokiem. Ponadto zaleca się użycie as
zamiast kontroli typu, a następnie rzutowania. Zamiast:
if (x is SomeType)
((SomeType)x).SomeMethod();
który generuje isinst
instrukcję dla is
słowa kluczowego i castclass
instrukcję dla obsady (skutecznie wykonując rzut dwukrotnie), powinieneś użyć:
var v = x as SomeType;
if (v != null)
v.SomeMethod();
To tylko generuje isinst
instrukcję. Pierwsza metoda ma potencjalną wadę w aplikacjach wielowątkowych, ponieważ warunek wyścigu może spowodować, że zmienna zmieni swój typ po is
pomyś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()