С# различные способы кастинга - (T) obj vs obj как T

Возможный дубликат:
casting vs с использованием ключевого слова 'as' в среде CLR

Я видел два разных способа кастинга на С#.

Например:

MyObj foo = (MyObj) bar; // this is what I see most of the times
MyObj foo = bar as MyObj; // I do see this sometimes
  • Итак, какова основная разница?
  • Каковы имена собственных тегов style 1 и style 2?
  • Как мне решить, когда использовать что?
  • Есть ли серьезные проблемы с производительностью?
  • Есть ли что-нибудь еще, что я должен знать об этой теме?

Большое спасибо за изучение этого:)

Ответ 1

Первый ( "прямой" или "C-стиль" ) генерирует исключение, если приведение недействительно. Это также единственный способ выполнить фактическое преобразование типа для объекта. (Обратите внимание, что преобразование типов отличается от кастинга, потому что приведение просто изменяет тип переменной, тогда как преобразование типа дает вам * другой тип объекта.)

Второй (нет имени, хотя вы можете назвать его "try cast", как он вызвал в VB.NET) оценивает null вместо того, чтобы бросать InvalidCastException. (Из-за этого поведения он работает только для ссылочных типов).

Отсутствие существенных проблем с производительностью по сравнению друг с другом.

Вы используете as, только если вы ожидаете, что ваш результат может быть недействительным. В противном случае используйте первый.


Кстати, MSDN может быть полезно для части вашего вопроса:

Оператор as подобен операции литья. Однако, если преобразование невозможно, как возвращает null вместо повышения исключения. Рассмотрим следующее выражение:

expression as type

Это эквивалентно следующему выражению, за исключением того, что выражение оценивается только один раз.

expression is type ? (type)expression : (type)null

Обратите внимание, что оператор as выполняет только преобразования ссылок и преобразования бокса. Оператор as не может выполнять другие преобразования, такие как пользовательские преобразования, которые вместо этого должны выполняться с использованием выражений.