2009-11-30 3 views
6

Je suis toujours en train d'essayer de faire correspondre mes connaissances anciennes et profondes du C/C++ à mes connaissances .Net, un peu plus superficielles. Aujourd'hui, le temps est venu de "comme" (et implicitement "est" et cast) en C#.Quel est le coût de "as" par rapport à QueryInterface dans COM ou dynamic_cast dans C++?

Mon modèle mental de « comme » est que c'est un QueryInterface ou dynamic_cast (un dynamic_cast avec l'argument de pointeur, pas de référence, qui est) pour C#. Ma question est double:

  1. Est-ce que ma comparaison est juste?
  2. Quel est le coût relatif de "as" par rapport à QueryInterface ou dynamic_cast?

Répondre

4
  1. Oui, la comparaison est juste, surtout lorsqu'ils traitent avec des pointeurs. Chacun des trois réussit et renvoie un pointeur non null du type cible ou retourne null.

  2. Vous pouvez réellement utiliser l'opérateur as lorsque vous travaillez avec des objets COM dans .NET, ce qui équivaut à QueryInterface avec une petite quantité de surcharge pour l'interopérabilité géré/COM. A l'intérieur du CLR (conversion entre les types gérés), l'opérateur as est extrêmement léger comparé à QueryInterface dans COM ou dynamic_cast dans C++. Pour toutes les places dans mon code où avait pour utiliser la distribution dynamique pour une raison quelconque, je n'ai jamais vu l'opérateur as montrer même un échantillon dans le profilage - et considérant que je maintiens une implémentation de type dynamique, lié à l'exécution language (StringTemplate), je suppose que cela signifie quelque chose. :)

Questions connexes