2010-07-05 14 views
11

Hay muchas maneras de convertir/convertir objetos en otros por lo que la diferencia entre ellos y si no hay diferencia por qué hay tantas maneras de lograr una cosa? ¿No es ese el daño al lenguaje?Diferencia entre los métodos de conversión/fundición en C#

digamos object obj to string.

obj.ToString() 
obj as string 
(string)obj 
Convert.ToString(obj) 
+1

Ser capaz de hacer las cosas de muchas maneras, no es el daño. Es un recurso poderoso. Al igual que en los idiomas hablados: puede expresarse de varias maneras (que pueden tener pequeñas diferencias de matices). –

Respuesta

17

Usted está haciendo cosas diferentes aquí:

  • obj.ToString() - se trata de una llamada al método del objeto ToString(). El objeto devuelve una cadena como estaba programado.
  • obj como cadena: este es un intento de convertir el objeto a una cadena, que puede fallar o no (si falla, el resultado es null), no se lanzará ninguna excepción.
  • (cadena) obj - esto es una conversión explícita de obj al tipo string, le está diciendo al compilador que obj es un string. Si obj no es un tipo de cadena, obtendrá una excepción de conversión.
  • Convert.ToString (obj) - Esta es una llamada explícita a la clase Convert para devolver una representación de cadena de obj.

Hay muchas de estas diversas maneras de conseguir un string de un object porque cada uno es diferente y tienen diferencias sutiles. Sí, en muchos casos la cadena devuelta será la misma, pero esto no está garantizado.

+0

etc. tipo "crea" .ToString() incluso si esto no existe? – eugeneK

+0

@eugeneK - en .NET todos los objetos heredan de 'object'. Dado que 'ToString()' está definido en él, todos los objetos tienen un método 'ToString()', que podría ser anulado. Hasta donde yo sé, 'Convert.ToString (obj)' simplemente llama eso, pero esencialmente, lo que dices es correcto - 'Convert' intenta 'crear' una cadena de un 'objeto', lo mejor que puede. – Oded

+1

@eugeneK, Convert.ToString usa la interfaz IConvertible del tipo para determinar cómo realizar la conversión. Esto puede tener una implementación diferente a .ToString(), aunque a menudo serán los mismos.También es posible buscar un TypeConverter para una clase y convertirlo a string (si el convertidor lo admite), que es el mecanismo utilizado por el diseñador cuando representa instancias como cadenas en la cuadrícula de propiedades. –

2
obj as string 
(string)obj 

"como" operador es seguro. si no se puede convertir devuelve un valor nulo, cuando() operador eleva excepción

+0

entonces ¿por qué() existe en absoluto? Las excepciones son mejores para ser manejadas antes de que ocurran en la programación "correcta". Podemos preguntar si el valor del resultado de obj como cadena == nulo y manejar "excepción". – eugeneK

+0

@eugeneK El operador "AS" funciona solo con tipos de referencia. no puedes hacerlo así int r = stmng as int; para pedir el tipo vuelve a consultar puede llamar a esto si (obj es string) – Arseny

+0

@eugeneK, la conversión explícita (en lugar de 'como') incluye una afirmación de que usted cree que el elenco tendrá éxito. Cuando creas que este es el caso, tiene sentido lanzar una excepción si el lanzamiento falla. Básicamente lanzas explícitamente cuando no puedes manejar de manera significativa una falla de lanzamiento si ocurriera. –

2

hay una diferencia:

  • ToString es un método que se basa en que el objeto en sí mismo lo define la representación de cadena se verá así.
  • El as palabra clave es la conversión de referencia: Note that the as operator only performs reference conversions and boxing conversions.
  • Mediante() para especificar el tipo es un explicit conversion mientras que la palabra clave como es implicit.
  • Usando la clase Convert realmente solo ayuda a analizarlo, el Convert.ToString probablemente solo envuelve .ToString() en el objeto.
+0

¿Qué son las conversiones de referencia y de boxeo en tres palabras? – eugeneK

+0

@eugeneK, no sé de tres palabras, pero consulte MSDN en boxeo/desempaquetado http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx –

1

En primer lugar, la conversión es muy diferente de convertir un objeto en una cadena. Casting no convierte un objeto en nada, solo asume otro tipo, mientras que ToString realmente crea una cadena a partir de un objeto (por supuesto, esto puede ser no-operativo si el objeto ya es una cadena).

Hay dos operaciones de fundición por el motivo explicado por Arseny: El operador as devolverá una referencia nula mientras que el operador () generará una excepción si el molde no es posible.

Hay dos métodos ToString, como obj.ToString() por supuesto, solo funciona si obj es realmente un objeto y no por ejemplo un int.Para el caso posterior, debe usar Convert.ToString(). Del mismo modo, cuando obj es null, entonces obj.ToString() elevará una excepción, mientras que Convert.ToString() puede volver alguna cadena sensible (por ejemplo "null").

1

lo [es] la diferencia entre aquellos

Hay 2 maneras de tipo de colada y una amplia gama de clases y métodos en la biblioteca. Typecasting se usa para objetos (valores) que ya son técnicamente cercanos y fuertemente relacionados.

Conversión (los métodos Convert y SomeType.Parse()) realmente están convirtiendo tipos de datos (String to Int32 no puede ser un molde).

¿Por qué hay tantas maneras de lograr una cosa?

La conversión y la conversión son acciones importantes que se utilizan con frecuencia. Es por eso que tenemos un conjunto de herramientas de grano fino, sin duda con un poco de superposición.

2

frecuencia existen varias formas de hacer básicamente lo mismo, pero con pequeñas variaciones. Hay una clara diferencia entre la fundición y conversión, en el que, por ejemplo, puede convertir un int a string, pero no se puede emitir un int a string.

usted tiene un punto válido en si esto es perjudicial para el idioma, pero no principalmente porque hay muchas maneras de hacer las cosas, sino porque pueden ser implementadas de manera inconsistente. Cuando implemente clases, debe tener cuidado para que se comporten como se espera. Comprobación de la igualdad es un ejemplo, donde se puede utilizar un método o un operador:

x == y 
x.Equals(y) 

Si implementa uno de ellos en su clase, pero no el otro, el compilador le ayuda con la advertencia de que tanto tiene que implementarse para que la clase se comporte correctamente.

Cuestiones relacionadas