Ответ 1
Есть несколько вариантов:
- Классический листинг :
Foo foo = (Foo)bar
- Оператор литья
as
:Foo foo = bar as Foo
- Тест
is
:bool is = bar is Foo
- Классический листинг должен проверить, можно ли безопасно использовать
bar
дляFoo
(быстро), а затем сделать это (медленнее) или выбросить исключение (очень медленное). - Оператор
as
должен проверить, можно ли отличитьbar
, а затем выполнить бросок или если его нельзя безопасно отличить, он просто возвращаетnull
. - Оператор
is
просто проверяет, может лиbar
быть добавлено в Foo и вернутьboolean
.
Тест is
выполняется быстро, поскольку он выполняет только первую часть операции полного литья. Оператор as
быстрее, чем классический, потому что не генерирует исключение, если приведение происходит неудачно (что делает его полезным для ситуаций, когда вы законно ожидаете, что бросок может потерпеть неудачу).
Если вам просто нужно знать, является ли переменная bar
Foo
, то используйте оператор is
, НО, если вы собираетесь если bar
является Foo
, и если да, , то выберите, тогда вы должны использовать оператор as
.
По сути, для того, чтобы убедиться, что акты действительны, каждая броска должна выполнять внутреннюю проверку эквивалента is
. Поэтому, если вы выполните проверку is
, за которой следует полный листинг (либо приведение as
, либо с помощью классического оператора трансляции), вы эффективно выполняете проверку is
дважды, что является небольшим дополнительным издержком.