Soy un programador experimentado en C / C ++ / C # que acaba de ingresar a VB.NET. Por lo general, uso CType (y CInt, CBool, CStr) para las emisiones porque tiene menos caracteres y fue la primera forma de transmisión a la que estuve expuesto, pero también conozco DirectCast y TryCast.
Simplemente, ¿hay alguna diferencia (efecto del reparto, rendimiento, etc.) entre DirectCast y CType? Entiendo la idea de TryCast.
vb.net
ctype
directcast
Caleb Hearth
fuente
fuente
Respuestas:
Lo primero que hay que tener en cuenta es que VB.NET no tiene un análogo directo al
(type)instance
mecanismo de conversión de C # . Menciono esto porque es útil como punto de partida para comparar los dos operadores VB.NET (y son operadores, no funciones, aunque tienen semántica de función).DirectCast()
es más estricto que el operador de conversión de C #. Solo te permite lanzar cuando el elemento que se está lanzando ya es del tipo al que estás lanzando. Creo que aún desempacará los tipos de valor, pero de lo contrario no realizará ninguna conversión. Entonces, por ejemplo, no puede transmitir deshort
aint
, como podría hacerlo con un(int)
lanzamiento de C # . Pero puede convertir de unaIEnumerable
a una matriz, si suIEnumerable
variable de objeto subyacente realmente es unaArray
. Y, por supuesto, puede convertir desdeObject
a cualquier cosa, asumiendo que el tipo de su instancia de objeto realmente está en algún lugar por debajo de su tipo de conversión en el árbol de herencia.Esto es deseable porque es mucho más rápido . Hay menos conversión y verificación de tipos que se deben realizar.
CType()
es menos estricto que el operador de conversión de C #. Hará cosas que no puedes hacer con un(int)
elenco de estilo simple , como convertir una cadena en un número entero. Tiene tanto poder como llamarConvert.To___()
en C #, donde___
es el tipo de destino de su elenco.Esto es deseable porque es muy poderoso. Sin embargo, este poder tiene un costo de desempeño; no es tan rápido como el
DirectCast()
operador de conversión de C # porque podría necesitar hacer bastante trabajo para terminar la conversión. Por lo general, debería preferirDirectCast()
cuando pueda.Finalmente, te perdiste un operador de conversión:,
TryCast()
que es un análogo directo alas
operador de C # .fuente
DirectCast
es otra ventaja. Si comete un error, el compilador se lo informa de inmediato, pero conCType
un error podría causar un comportamiento incorrecto ocasional en tiempo de ejecución, tal vez en alguna máquina de usuario con diferentes configuraciones regionales.DirectCast
,TryCast
,CType
/Convert.ToXYZ()
,C<xyz>()
sería correcto?DirectCast
solo es estricta con las clases, no con las interfaces (porque puede tener tipos COM, y quizás otros, que realmente implementen interfaces no definidas por la.GetInterfaces
lista de tipos .NET ).TryCast()
yaas
no son exactamente iguales.TryCast()
solo funciona con tipos de referencia, mientras queas
funciona con cualquier cosa que pueda ser nula. Entoncesint? icast = myNum as int?;
funcionará bien, peroDim icast as Integer? = TryCast(myNum, Integer?)
dará un error de compilación. Solo una diferencia peculiar más entre los dos idiomas. lolCon
CType
puedes escribir algo como estoCtype("string",Integer)
. Pero conDirectCast
la declaración anterior daría un error de tiempo de compilación.fuente
DirectCast
es más restrictivo queCType
.Por ejemplo, esto arrojará un error:
También se mostrará en el IDE de Visual Studio.
Sin embargo, esto no arroja un error:
fuente