Ваше понимание верно. Это звучит как попытка микрооптимизации для меня. Вы должны использовать обычное приведение, когда вы уверены в типе. Помимо генерации более разумного исключения, оно также быстро дает сбой. Если вы ошибаетесь в своем предположении о типе, ваша программа немедленно завершится сбоем, и вы сможете сразу увидеть причину сбоя, а не ждать NullReferenceException
или ArgumentNullException
даже логической ошибки в будущем. Как правило, as
выражение, за которым не следует null
проверка, является запахом кода.
С другой стороны, если вы не уверены в касте и ожидаете, что он потерпит неудачу, вы должны использовать as
вместо обычного броска, обернутого try-catch
блоком. Кроме того, as
рекомендуется использование над проверкой типа, сопровождаемой приведением. Вместо:
if (x is SomeType)
((SomeType)x).SomeMethod();
который генерирует isinst
инструкцию для is
ключевого слова и castclass
инструкцию для приведения (эффективно выполняя приведение дважды), вы должны использовать:
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()