Pregunta Cuándo usar un Cast o Convert


Tengo curiosidad por saber cuál es la diferencia entre un elenco para decir un int en comparación con el uso de Convert.toInt32 (). ¿Hay algún tipo de ganancia de rendimiento con el uso de uno?

También qué situaciones deberían usarse cada una. Actualmente estoy más inclinado a usar Convert pero no tengo una razón para ir de ninguna manera. En mi opinión, veo que ambos logran el mismo objetivo.


74
2017-07-02 19:48


origen


Respuestas:


Ver Diferencia entre el elenco y el convertido en otro foro

Responder

los Convert.ToInt32(String, IFormatProvider) debajo llama al Int32.Parse (leer comentarios).
  Entonces la única diferencia es que si se pasa una cadena nula, regresa 0, mientras que Int32.Parse arroja un ArgumentNullException.
  Es realmente una cuestión de elección, cualquiera que sea el que uses.

Personalmente, no uso ninguno, y tiendo a usar el TryParse funciones (p. System.Int32.TryParse())


ACTUALIZAR

El enlace en la parte superior está roto, ver esta respuesta en StackOverflow.


40
2017-07-02 19:53



Emitir cuando es realmente un tipo de int, Convertir cuando no es un int pero quieres que se convierta en uno.

Por ejemplo int i = (int)o; cuando sabes o es un int

int i = Convert.ToInt32("123") porque "123" no es un int, es una representación de cadena de un int.


74
2017-07-02 19:56



Hay otra diferencia. "Convertir" siempre está desbordado, mientras que "emitir" tal vez, dependiendo de su Configuración y la palabra clave "marcada" o "no seleccionada" utilizada.

Para ser más explícito. Considera el código:

int source = 260;
byte destination = (byte)source;

Entonces el destino será 4 sin una advertencia.

Pero:

int source = 260;
byte destination = Convert.ToByte(source);

te dará una excepción.


10
2018-04-15 12:18



No todos los tipos admiten conversión como

int i = 0;
decimal d = (decimal)i;

porque es necesario implementar operador explícito. Pero .NET también proporciona Interfaz IConvertible, por lo que cualquier tipo que implemente esa interfaz se puede convertir a la mayoría de los tipos incorporados en el marco. Y finalmente, la clase Convert ayuda a operar con tipos implementa la interfaz IConvertible.


6
2017-07-02 19:55



Un elenco simplemente le dice al compilador que este objeto es en realidad una implementación de un tipo diferente y lo trata como la nueva implementación ahora. Mientras que un converso dice que esto no hereda de lo que está tratando de convertir, pero hay una manera establecida de hacerlo. Por ejemplo, digamos que estamos convirtiendo "16" en un int. "16" es una cadena y no hereda de int de ninguna manera. Pero, es obvio que "16" podría convertirse en int 16.


3
2017-07-02 19:54



Al lanzar mi 2c, parece que una distinción conceptual podría ser útil. No es que yo sea un experto ...

Casting está cambiando el tipo de representante. Entonces "32" y 32L y 32.0f parecen razonables para el uno con el otro. c # no admitirá automáticamente el "32", pero la mayoría de los lenguajes dinámicos sí lo harán. Entonces usaré el (largo) "32" o (String) 32L. Cuando puedo. También tengo otra regla: el casting debería ser completamente repetible.

La conversión no tiene que ser una tarea que se pueda repetir, y simplemente puede crear un objeto totalmente nuevo.

El área gris es, por ejemplo, la cadena "32xx". Se puede hacer un caso que cuando lo lances, se convierte en 32L (el número fue analizado hasta que no pudo ser). Perl usó esto. Pero esto viola mi requisito de ida y vuelta. Lo mismo ocurre con 32.5f a 32L. Casi todos los idiomas, incluidos los tipeados de forma muy estática, permiten esto, y también falla la regla de la ronda de los disparos. Es gris porque si permite que se "eche" "32", entonces en tiempo de compilación no se sabe si podría ser "32xxx".

Otra distinción que se puede hacer es usar casting para "IsA" y no para "makeLookLikeA". Por lo tanto, si sabe que una cadena proviene de una base de datos pero en realidad es una int en el esquema no oficial, puede usar un molde (aunque en este caso c # también quiere que use Convert). Lo mismo iría por un flotador. Pero no para cuando solo estás usando el molde para truncar el flotador. Esta distinción también explica DownCasting y UpCasting: el objeto siempre fue 'IsA', pero el tipo podría haberse generalizado para una lista.


2
2018-04-01 16:54



Hay muchas sobrecargas para Convert.ToInt32 eso puede tomar, por ejemplo, una cadena. Al intentar lanzar una cadena a un int arrojará un error de compilación. El punto es que son para diferentes usos. Convertir es especialmente útil cuando no estás seguro de qué tipo es el objeto desde el que estás lanzando.


1
2017-07-02 19:55



Hay una razón más por la que debe usar Convert.ToInt32 en lugar de un molde.

Por ejemplo:

float a = 1.3f;
float b = 0.02f;
int c = (int)(a / b);
int d = Convert.ToInt32(a / b);`

El resultado es c = 64 yd = 65


0
2018-01-22 09:41



string number = "123abc";

int num;

Int32.TryParse (number, out num); // ninguna excepción lanzada en esta llamada

Convert.ToInt32 (número); // se lanza una excepción en esta llamada


0
2018-05-26 06:24