Что такое хорошее использование оператора is-operator

Каково хорошее использование оператора is?

Конструкция ниже для кастинга не является рекомендуемым способом, практически вся документация предпочитает as-operator с нулевой проверкой.

if(obj is SomeClass)
{
  SomeClass some = (SomeClass)obj;
  ....
}

И уверен, что это (очень небольшое) увеличение производительности, а некоторые даже упоминают безопасность протектора. И да, это правда...

Итак, почему мы имеем оператор is? Где "as-operator с нулевой проверкой" не работает или не подходит?
Имеет ли преимущество ограничение объема декларации, которую вы получаете, используя оператор is-operator?

Ответы

Ответ 1

as не работает с не-nullable struct s:

object o = 123;
int i = o as int; // compile error

Однако:

object o = 123;
if(o is int) {
    int i = (int)o;
    //...
}

конечно, начиная с версии 2.0, вы также можете использовать:

int? i = o as int?;

и проверьте null как обычно.

Существует также сценарий, что вам не нужны значения объекта... вам просто нужно знать, что это такое:

if(obj is Something)
    throw new InvalidOperationException("Seriously, don't do that");
// phew! dodged a bullet; we're ok here...

Обратите внимание, что GetType() не подходит для этого, так как вы не хотите рассматривать подклассы, интерфейсы и т.д. вручную.