operator - convert c#
Cuándo usar un Cast o Convert (9)
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.
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.
Hay muchas sobrecargas para Convert.ToInt32
que pueden 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.
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.
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
No todos los tipos admiten conversión como
int i = 0;
decimal d = (decimal)i;
porque es necesario implementar un operador explícito . Pero .NET también proporciona una interfaz IConvertible , por lo que cualquier tipo que implemente esa interfaz se puede convertir a la mayoría de los tipos incorporados en el framework. Y finalmente, la clase Convert ayuda a operar con tipos implementa la interfaz IConvertible.
Transmitir cuando realmente es 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.
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.
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
Ver Diff entre Cast y Convert en otro foro
Responder
El
Convert.ToInt32(String, IFormatProvider)
debajo llama alInt32.Parse
(leer comentarios).
Entonces, la única diferencia es que si se pasa una cadena nula, devuelve0
, mientras queInt32.Parse
lanza unaArgumentNullException
.
Es realmente una cuestión de elección, cualquiera que sea el que uses.
Personalmente, no uso ninguno de los dos y uso las funciones TryParse
(por ejemplo, System.Int32.TryParse()
).
ACTUALIZAR
El enlace en la parte superior está roto, vea esta respuesta en .