¿Cómo debo emitir en VB.NET?

151

¿Son todos estos iguales? ¿En qué circunstancias debería elegir cada uno sobre los demás?

  • var.ToString ()

  • CStr (var)

  • CType (var, String)

  • DirectCast (var, String)


EDITAR: Sugerencia de NotMyself ...

  • TryCast (var, String)
Zack Peterson
fuente

Respuestas:

156

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

  • var.ToString()te dará la representación de cadena de un objeto, independientemente de qué tipo sea. Use esto si aún varno es una cadena.
  • CStr(var)es el operador de conversión de cadena 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 proporcionado.
  • DirectCast(var, String)se usa para convertir un objeto en una cadena. Si sabe que una variable de objeto es, de hecho, una cadena, use esto. Esto es lo mismo que (string)varen C #.
  • TryCast(como lo menciona @ NotMyself ) es similar DirectCast, pero regresará Nothingsi la variable no se puede convertir en una cadena, en lugar de lanzar una excepción. Esto es lo mismo que var as stringen C #. La TryCastpágina en MSDN también tiene una buena comparación.
bdukes
fuente
15
Nunca hay una razón para usar CType (var, String) en lugar de CStr (var), hacen exactamente lo mismo.
Jonathan Allen
2
@Maslow TryCastsolo funciona para los tipos de valor, ya que debe ser un tipo que pueda tener Nothingcomo valor
bdukes
1
@Martinho tiene mucha razón. Eso debería decir "solo funciona para el tipo de referencia "
bdukes
3
CStr(var)se ahogará y generará una excepción si la var es DBNull.Value, pero la alternativa Convert.ToString(var)devolverá una cadena vacía.
MCattle
Dim myList AS ArrayList=new ArrayListCuando escribes (From e In myList select CType(e.Name,String)).ToArray()no funciona. Vine a escribir ... select CType(e.Name.ToString,String)).ToArray()y recuperé mi sonrisa.
Bellash
13

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

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

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

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

DirectCastse usa si los tipos están relacionados por herencia o comparten una interfaz común, arrojará una excepción si el lanzamiento no es posible, trycastno devolverá nada en este caso

Siddharth Rout
fuente
8

MSDN parece indicar que las conversiones de 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 indica que es cuando hay una relación de herencia; creo que esto significa que la cordura del elenco se verifica en el momento de la compilación y las optimizaciones se pueden aplicar, mientras que CType siempre usa el Tiempo de ejecución de VB.)

Cuando escribo código VB .NET, lo que uso depende de lo que estoy haciendo. Si voy a tirar el código prototipo, uso lo que sea que escriba para escribir. Si se trata de código en serio, trato de usar un elenco de Cxxx. Si no existe uno, uso DirectCast si tengo una creencia razonable de que existe una relación de herencia. Si se trata de una situación en la que no tengo idea de si la conversión debería tener éxito (entrada del 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 evitar es que tiendo a usar ToString en lugar de CStr, pero supuestamente Cstr es más rápido.

OwenP
fuente
8

Prefiero la siguiente sintaxis:

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

If str IsNot Nothing Then

Ja, se nota que normalmente escribo 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 transmisión. Su lanzamiento tiene éxito o su variable se inicializa a nulo y se ocupa de eso en consecuencia.

No a mí mismo
fuente
2
Creo que estas equivocado. no es una buena idea usar TryCast en absoluto. en un caso como el suyo, debe usarse number.ToString () o CStr (número).
Shimmy Weitzhandler
44
@Shimmy: ¿Cuál es la razón detrás de no usar TryCast en absoluto? ¿No es mejor que DirectCast para evitar una excepción en ciertos escenarios?
Dienekes
3
@Dienekes y NotMyself. TryCast es solo para tipos de REFERENCIA. Aquí tenemos un número entero, que es un tipo VALOR. El compilador rechazará TryCast. Además, el objetivo es una cadena. Cualquier entidad .Net excepto Nothing es compatible .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 los tipos de valor), CStr (lo que sea) es seguro, ya que no puede manejar Nothing; el resultado será Nothing, en la variable String. TryCast es muy útil, pero no aquí.
ToolmakerSteve
4

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

Zack Peterson
fuente
-1 porque DirectCast es descaradamente NO apropiado aquí, excepto en situaciones muy limitadas, que no te molestaste 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 esté discutiendo una situación en la que DirectCast es apropiado.
ToolmakerSteve
... Si la pregunta no hubiera mencionado Stringy ToString, mi queja no se aplicaría. No debe abogar por DirectCast, hasta que haya reducido el tema de la CONVERSIÓN general.
ToolmakerSteve
1

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

SickPuP
fuente
1
Para su información, según Paul Vick de Microsoft, los operadores de 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 justificación parece dudosa, dada la capacidad de optimizar JIT las llamadas de función. panopticoncentral.net/2004/05/31/the-native-net-language
ToolmakerSteve
0

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

joek1975
fuente
2
DirectCast es más rápido que CStr, pero solo puede usarlo cuando convierte un objeto de cadena en una variable de cadena. Fallará si intenta convertir cualquier otro objeto en una cadena.
Jonathan Allen el