Сколько стоит «как» по сравнению с QueryInterface в COM или dynamic_cast в C ++? - PullRequest
6 голосов
/ 30 ноября 2009

Я все еще пытаюсь сопоставить свои глубокие и старые знания из C / C ++ с моими более поверхностными знаниями .Net. Сегодня пришло время «как» (и неявно «есть» и приведено) в C #.

Моя ментальная модель «как» состоит в том, что это QueryInterface или dynamic_cast (dynamic_cast с аргументом указателя, а не ссылкой, то есть) для C #. У меня вопрос двоякий:

  1. Справедливо ли мое сравнение?
  2. Какова относительная стоимость "как" по сравнению с QueryInterface или dynamic_cast?

1 Ответ

4 голосов
/ 30 ноября 2009
  1. Да, сравнение справедливо, особенно при работе с указателями. Каждое из трех либо успешно завершается и возвращает ненулевой указатель целевого типа, либо возвращает нулевое значение.

  2. На самом деле вы можете использовать оператор as при работе с COM-объектами в .NET, что делает его эквивалентным QueryInterface с небольшим объемом служебных данных для управляемого взаимодействия / COM-взаимодействия. Внутри CLR (приведение между управляемыми типами) оператор as является чрезвычайно легким по сравнению с QueryInterface в COM или dynamic_cast в C ++. Для всех мест в моем коде, где у меня было по какой-то причине для использования динамического приведения, я никогда не видел, чтобы оператор as показывал хотя бы один пример в профилировании - и учитывая, что я поддерживаю реализацию динамически типизированный язык времени исполнения (StringTemplate), я предполагаю, что это что-то значит. :)

...