FAQ C++/CLI et VC++.Net
FAQ C++/CLI et VC++.NetConsultez toutes les FAQ
Nombre d'auteurs : 29, nombre de questions : 248, création le 22 février 2013
Le cast entre types est le fait de convertir un type en un autre. Il fonctionne aussi bien pour les types natifs (int, double, etc ...) que pour les classes et les structures.
Le C++/CLI propose trois opérateurs de cast différents : static_cast, dynamic_cast et safe_cast.
Chacun a pour but d'essayer de convertir un type en un autre. "Essayer", car pour pouvoir convertir décemment une classe en une autre, elles ont besoin d'être du même type ou bien d'en hériter. (on parle alors de downcasting).
L'opérateur static_cast est le plus rapide d'entre eux, mais c'est également le plus dangereux, car il part du principe que le développeur sait ce qu'il fait, donc il ne teste pas la validité du cast.
L'opérateur dynamic_cast est plus lent que le static_cast car il vérifie que la conversion de type est valide. Si elle ne l'est pas, il renverra nullptr.
L'opérateur safe_cast enfin permet la conversion vérifiable entre les types de .Net. C'est cet opérateur qu'on va donc utiliser le plus souvent.
Lien : Les casts dans la faq C++
Lien : Comment implémenter l'opérateur d'assignation 'as' du C# ?
Lien : Pourquoi utiliser safe_cast ?
safe_cast est similaire à static_cast dans la mesure où il permet les conversions implicites et explicites de types. Il ressemble à dynamic_cast dans la mesure où il vérifie la validité du cast.
L'intérêt de caster en utilisant safe_cast plutôt que static_cast est qu'il produit du MSIL vérifiable. Cela permet aussi d'intercepter un message d'exception lorsque le cast échoue (System::InvalidCastException).
Le cast (old style) C a pour syntaxe :
MonType ^
type1 =
(MonType^
)(type2);
Lorsqu'on l'utilise, c'est d'abord le safe_cast qui sera utlisé comme cast. Ce qui fait qu'on pourra se passer d'écrire safe_cast en utilisant le cast style C.
Ainsi, ces deux lignes sont équivalentes :
TextBox ^
T =
safe_cast<
TextBox ^>
(sender);
TextBox ^
T =
(TextBox ^
)(sender);