2008-09-02 11 views

Respuesta

135

Todos estos son ligeramente diferentes, y generalmente tienen un uso aceptable.

  • var.ToString() va a darle la representación de cadena de un objeto, independientemente de qué tipo es. Úselo si var ya no es una cadena.
  • CStr(var) es el operador de conversión de 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, usando cualquier operador de conversión provisto.
  • DirectCast(var, String) se utiliza 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 por @NotMyself) es como DirectCast, pero devolverá Nothing si la variable no se puede convertir en una cadena, en lugar de lanzar una excepción. Esto es lo mismo que var as string en C#. La página TryCast en MSDN también tiene una buena comparación.
+15

Nunca hay una razón para usar CType (var, String) en lugar de CStr (var), hacen exactamente lo mismo. –

+0

trycast aparentemente no funciona con Enums – Maslow

+2

@Maslow 'TryCast' solo funciona para tipos de valores, ya que necesita ser un tipo que puede tener' Nothing' como valor – bdukes

8

prefiero la siguiente sintaxis:

Dim number As Integer = 1 
Dim str As String = String.TryCast(number) 

If str IsNot Nothing Then 

Ja se puede decir que normalmente escribir 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.

+1

Creo que estás equivocado. no es una buena idea usar TryCast en absoluto. en un caso como el suyo, deben usarse number.ToString() o CStr (number). – Shimmy

+4

@Shimmy: ¿Cuál es la razón detrás de no usar TryCast? ¿No es mejor que DirectCast evite una excepción en ciertos escenarios? – Dienekes

+2

@Dienekes y NotMyself. TryCast es solo para tipos de REFERENCIA. Aquí, tenemos un Entero, que es un tipo de VALOR. El compilador rechazará TryCast. Además, el objetivo es una cadena. Cualquier entidad .Net excepto Nothing admite '.ToString()'. Un tipo de valor, como Integer, no puede ser Nothing. Entonces, en este caso, CStr (número) o number.ToString() es seguro. En el caso general (no solo en los tipos de valor), CStr (lo que sea) es seguro, porque puede manejar Nada: el resultado será Nada, en la variable Cadena. TryCast es muy útil, simplemente no aquí. – ToolmakerSteve

7

MSDN parece indicar que los moldes Cxxx para tipos específicos pueden mejorar el rendimiento en VB .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 molde se controla en tiempo de compilación y se pueden aplicar optimizaciones 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.

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

0

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

+2

DirectCast es más rápido que CStr, pero solo puede usarlo al convertir un objeto de cadena en una variable de cadena. Fallará si intenta convertir cualquier otro objeto en una cadena. –

3
+0

-1 porque DirectCast es descaradamente NO apropiado aquí, excepto en situaciones muy limitadas, que no se molestó en mencionar. DirectCast es bueno cuando sabes que tienes dos TIPOS DE REFERENCIA RELACIONADOS, y quieres un casting eficiente entre ellos. Dado que la pregunta es sobre la obtención de un 'String', es poco probable que el OP estuviera discutiendo una situación en la que DirectCast sea apropiado. – ToolmakerSteve

+0

... Si la pregunta no hubiera mencionado 'String' y' ToString', mi queja no se aplicaría. No debe abogar por DirectCast, hasta que haya reducido el tema de la CONVERSIÓN general. – ToolmakerSteve

9

Cstr() está compilado en línea para un mejor rendimiento.

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

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

TryParse() de String a basar typeif posible de otro modo devuelve false

DirectCast utilizarse si los tipos están relacionados a través de herencia o comparten una interfaz común, se producirá una excepción si el yeso no es posible, trycast volverá nada en este instancia

1

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.

+1

FYI, según Paul Vick en Microsoft, los operadores Cxxx fueron más rápidos que las funciones Convert.Toxxx, al menos en 2004, porque Cxxx compila directamente a IL, en lugar de llamar a una función. Aunque su razonamiento parece dudoso, dada la capacidad de JIT de optimizar las llamadas de función de distancia. http://www.panopticoncentral.net/2004/05/31/the-native-net-language/ – ToolmakerSteve