Ваше розуміння вірно. Це звучить як намагання мікрооптимізувати для мене. Ви повинні використовувати звичайний ролик, коли впевнені у своєму роді. Окрім створення більш розумного винятку, воно також швидко провалюється. Якщо ви помиляєтесь у своєму припущенні про тип, ваша програма вийде з ладу негайно, і ви зможете побачити причину відмови негайно, а не чекати NullReferenceExceptionчи ArgumentNullExceptionабо навіть логічну помилку десь у майбутньому. Взагалі asвираз, за яким nullдесь не слід перевіряти, - це запах коду.
З іншого боку, якщо ви не впевнені в складі кадру і очікуєте, що він не вдасться, вам слід скористатися asзамість звичайного амплуа, обгорнутого try-catchблоком. Крім того, asрекомендується використовувати для перевірки типу, за якою слідує виступ. Замість:
if (x is SomeType)
((SomeType)x).SomeMethod();
яка генерує isinstінструкцію для isключового слова, і acastclass інструкцію для акторського складу (ефективно виконуючи двічі), слід використовувати:
var v = x as SomeType;
if (v != null)
v.SomeMethod();
Це генерує лише isinst інструкцію. Колишній метод має потенційний недолік у багатопотокових програмах, оскільки умова перегонів може спричинити зміну свого типу змінної після того, як isперевірка була успішною та не вдалася на лінію передачі . Останній метод не схильний до цієї помилки.
Наступне рішення: не рекомендується використовувати у виробничому коді. Якщо ви справді ненавидите таку фундаментальну конструкцію в C #, ви можете розглянути можливість переходу на VB чи іншу мову.
У випадку, якщо хтось відчайдушно ненавидить синтаксис литого, він / вона може написати метод розширення, щоб імітувати гру:
public static T To<T>(this object o) { // Name it as you like: As, Cast, To, ...
return (T)o;
}
і використовувати акуратний [?] синтаксис:
obj.To<SomeType>().SomeMethod()