¿Cómo debería lanzar en VB.NET?

¿Son todos estos iguales? ¿En qué circunstancias debo elegir cada una sobre las demás?

  • var.ToString ()

  • CStr (var)

  • CType (var, String)

  • DirectCast (var, String)


EDITAR: Sugerencia de NotMyself

  • TryCast (var, String)

Esos son todos ligeramente diferentes, y generalmente tienen un uso aceptable.

  • var. ToString () le dará la representación de cadena de un objeto, independientemente de qué tipo sea. Use esto si var ya no es una cadena.
  • CStr (var) es el operador de CStr cadenas VB. No soy un tipo VB, por lo que sugeriría evitarlo, pero en realidad no va a doler nada. Creo que es básicamente lo mismo que CType .
  • CType (var, String) convertirá el tipo dado en una cadena, utilizando cualquier operador de conversión provisto.
  • DirectCast (var, String) se usa para convertir un objeto en una cadena. Si sabes que una variable de objeto es, de hecho, una cadena, úsala. Esto es lo mismo que (string)var en C #.
  • TryCast (como se menciona en @ NotMyself ) es como DirectCast , pero devolverá Nothing si la variable no se puede convertir en una cadena, en lugar de arrojar una excepción. Esto es lo mismo que var as string en C #. La página de TryCast en MSDN también tiene una buena comparación.

Cstr() se comstack en línea para un mejor rendimiento.

CType permite conversiones entre tipos si se define un operador de conversión

ToString() Entre el tipo de base y la cadena arroja una excepción si la conversión no es posible.

TryParse() De cadena a base de typeif si es posible, de lo contrario devuelve falso

DirectCast usa si los tipos están relacionados por herencia o comparten una interfaz común, lanzará una excepción si el reparto no es posible, trycast no devolverá nada en esta instancia

Prefiero la siguiente syntax:

 Dim number As Integer = 1 Dim str As String = String.TryCast(number) If str IsNot Nothing Then 

Ja, puedes decir que normalmente escribo el código en C #. 8)

La razón por la que prefiero TryCast es que no tiene que meterse con la sobrecarga de las excepciones de conversión. Tu conversión tiene éxito o tu variable se inicializa a nula y lidias con eso en consecuencia.

MSDN parece indicar que las conversiones de Cxxx para tipos específicos pueden mejorar el rendimiento en .NET porque se convierten en código en línea. Por alguna razón, también sugiere DirectCast en lugar de CType en ciertos casos (la documentación dice que es cuando hay una relación de herencia, creo que esto significa que la cordura del elenco se controla en tiempo de comstackción y las optimizaciones se pueden aplicar, mientras que CType siempre usa el Tiempo de ejecución de VB).

Cuando estoy escribiendo código VB .NET, lo que uso depende de lo que estoy haciendo. Si es un código prototipo que voy a tirar, uso lo que sea que escriba. Si se trata de un código que me preocupa, trato de usar un elenco Cxxx. Si no existe uno, uso DirectCast si tengo una creencia razonable de que hay una relación de herencia. Si es una situación en la que no tengo idea de si el reparto debe tener éxito (entrada de usuario -> enteros, por ejemplo), entonces uso TryCast para hacer algo más amigable que lanzar una excepción al usuario.

Algo que no puedo evitar es que tiendo a usar ToString en lugar de CStr, pero supuestamente Cstr es más rápido.

El usuario Konrad Rudolph aboga por DirectCast () en la pregunta de desbordamiento de stack “Características ocultas de VB.NET” .

De acuerdo con el examen de certificación, debe usar Convert.ToXXX () siempre que sea posible para conversiones simples, ya que optimiza el rendimiento mejor que las conversiones CXXX.

En un momento, recuerdo haber visto el estado de la biblioteca de MSDN para usar CStr () porque era más rápido. No sé si esto es cierto sin embargo.