Ваше розуміння вірно. Це звучить як намагання мікрооптимізувати для мене. Ви повинні використовувати звичайний ролик, коли впевнені у своєму роді. Окрім створення більш розумного винятку, воно також швидко провалюється. Якщо ви помиляєтесь у своєму припущенні про тип, ваша програма вийде з ладу негайно, і ви зможете побачити причину відмови негайно, а не чекати 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()