Je suis un programmeur C / C ++ / C # expérimenté qui vient tout juste d'entrer dans VB.NET. J'utilise généralement CType (et CInt, CBool, CStr) pour les casts car il y a moins de caractères et c'était la première façon de diffuser à laquelle j'ai été exposé, mais je connais également DirectCast et TryCast.
Simplement, y a-t-il des différences (effet de distribution, performances, etc.) entre DirectCast et CType? Je comprends l'idée de TryCast.
vb.net
ctype
directcast
Caleb Hearth
la source
la source
Réponses:
La première chose à noter est que VB.NET n'a pas d'analogue direct au
(type)instance
mécanisme de conversion de C # . J'évoque cela parce que c'est utile comme point de départ pour comparer les deux opérateurs VB.NET (et ce sont des opérateurs, pas des fonctions, même s'ils ont une sémantique de fonction).DirectCast()
est plus strict que l'opérateur de conversion C #. Il ne vous permet de lancer que lorsque l'élément en cours de diffusion est déjà du type vers lequel vous lancez le casting. Je pense que cela déballera toujours les types de valeur, mais sinon, il ne fera aucune conversion. Ainsi, par exemple, vous ne pouvez pas effectuer de cast deshort
versint
, comme vous le feriez avec un(int)
cast C # . Mais vous pouvez effectuer un cast de anIEnumerable
vers un tableau, si votreIEnumerable
variable objet sous-jacente est vraiment unArray
. Et bien sûr, vous pouvez effectuer un cast deObject
vers n'importe quoi, en supposant que le type de votre instance d'objet se trouve vraiment quelque part en dessous de votre type de distribution dans l'arborescence d'héritage.C'est souhaitable car c'est beaucoup plus rapide . Il y a moins de conversion et de vérification de type à effectuer.
CType()
est moins strict que l'opérateur de conversion C #. Il fera des choses que vous ne pouvez tout simplement pas faire avec un(int)
cast de style simple , comme convertir une chaîne en entier. Il a autant de puissance que d'appelerConvert.To___()
en C #, où___
est le type de cible de votre distribution.C'est souhaitable car c'est très puissant. Cependant, cette puissance se fait au détriment des performances; ce n'est pas aussi rapide que
DirectCast()
ou l'opérateur de cast de C # car il peut avoir besoin de beaucoup de travail pour terminer le casting. En général, vous devriez préférerDirectCast()
quand vous le pouvez.Enfin, vous avez manqué un opérateur de casting:,
TryCast()
qui est un analogue direct à l'as
opérateur C # .la source
DirectCast
est un autre avantage. Si vous faites une erreur, le compilateur vous le dit immédiatement, mais avecCType
une erreur, cela pourrait provoquer un mauvais comportement occasionnel au moment de l'exécution - peut-être sur une machine utilisateur avec des paramètres régionaux différents.DirectCast
,TryCast
,CType
/Convert.ToXYZ()
,C<xyz>()
serait correct?DirectCast
n'est stricte qu'avec les classes, pas les interfaces (car vous pouvez avoir des types COM - et peut-être d'autres - qui implémentent en fait des interfaces non définies par la.GetInterfaces
liste des types .NET ).TryCast()
etas
ne sont pas exactement les mêmes.TryCast()
fonctionne uniquement avec les types de référence, tandis queas
fonctionne avec tout ce qui peut être nul. Celaint? icast = myNum as int?;
fonctionnera très bien, maisDim icast as Integer? = TryCast(myNum, Integer?)
donnera une erreur de compilation. Encore une différence particulière entre les deux langues. lolAvec
CType
vous pouvez écrire quelque chose comme çaCtype("string",Integer)
. Mais avecDirectCast
l'instruction ci-dessus, cela donnerait une erreur de compilation.la source
DirectCast
est plus restrictif queCType
.Par exemple, cela générera une erreur:
Il sera également affiché dans l'IDE de Visual Studio.
Cependant, cela ne génère pas d'erreur:
la source