2009-08-27 8 views
11

¿Qué es el tipo de fundición? ¿Para qué sirve esto? ¿Como funciona?Typecasting en C#

Proporcione un ejemplo de tutorial, no pude encontrar ninguno bueno buscando en Google.

+2

ha ha ha .. ¡¡qué chiste !!! – MAC

+0

Te puedo decir que sabes cómo formular tus preguntas, ¡amigo! –

+0

[http://en.wikipedia.org/wiki/Type_conversion](http://en.wikipedia.org/wiki/Type_conversion) – Raghav

Respuesta

50

Casting es generalmente una cuestión de decirle al compilador que a pesar de que sólo se sabe que es un valor de algún tipo general, se sabe que es en realidad de un tipo más específico. Por ejemplo:

object x = "hello"; 

... 

// I know that x really refers to a string 
string y = (string) x; 

Existen varios operadores de conversión. La forma (typename) expression puede hacer tres cosas diferentes:

  • Una conversión unboxing (por ejemplo, a partir de un número entero en caja a int)
  • Una conversión definida por el usuario (por ejemplo, fundición XAttribute a string)
  • Una conversión de referencia dentro de una tipo de jerarquía (por ejemplo, fundición object a string)

Todos estos pueden fallar en tiempo de ejecución, en cuyo caso se produce una excepción .

El operador as, por el contrario, nunca se produce una excepción - en cambio, el resultado de la conversión es null si falla:

object x = new object(); 
string y = x as string; // Now y is null because x isn't a string 

Puede ser utilizado para unboxing a un tipo de valor anulable:

object x = 10; // Boxed int 
float? y = x as float?; // Now y has a null value because x isn't a boxed float 

también hay conversiones implícitas, por ejemplo, de int a long:

int x = 10; 
long y = x; // Implicit conversion 

¿Eso cubrir todo lo que estuviera interesado?

+1

¡Buena respuesta Jon! – UnkwnTech

+2

@jon Skeet da respuesta y no cubre todo lo que ha sucedido alguna vez? – Shrivallabh

+0

Lea [this] (http://stackoverflow.com/questions/2690866/what-is-the-purpose-of-a-question-mark-after-a-type-for-example-int- myvariabl) para ver qué hace el signo de interrogación después del tipo 'flotar '. – martijnn2008

2

Ver this o this:

Debido a que C# es estático de tipos, en tiempo de compilación, después se declara una variable, no puede declararse de nuevo o usado para almacenar los valores de otro tipo, a menos que el tipo se puede convertir en de la variable de tipo

...

Sin embargo, a veces puede ser que necesite para copiar un valor en un parámetro variable o método de otro tipo. Por ejemplo, puede tener una variable entera que debe pasar a un método cuyo parámetro se escribe como doble. O puede necesitar asignar una variable de clase a una variable de un tipo de interfaz. Este tipo de operaciones se llaman conversiones de tipo. En C#, puede realizar los siguientes tipos de conversiones

+0

Desde el enlace: "Sin embargo, si no se puede realizar una conversión sin riesgo de perder información, el compilador requiere que realice una conversión explícita, lo que se conoce como conversión. " ¿Está diciendo que el casting es lo mismo que la conversión explícita? –

0

Transmisión de un tipo de datos a otro.

Para una lectura general, ver this.

Ver también msdn

3

Casting significa crear una referencia a un objeto que sea de un tipo diferente al de la referencia que está actualmente sosteniendo. Puede hacer upcasting o downcasting y cada uno tiene diferentes beneficios.

upcasting:

string greeting = "Hi Bob"; 
object o = greeting; 

Esto crea una referencia más general (objeto) de la referencia más específica (cadena).

Console.WriteLine("Type of o is " + o.GetType()); 

Ese código no ser necesario cambiar no importa qué objetos se establece o to: tal vez has código que puede manejar cualquier objeto, como esta escrito.

downcasting:

object o = "Hi Bob"; 
string greeting = (string)o; 

Aquí desea una referencia más específica. Usted puede saber que el objeto es una cadena (se puede probar esto, por ejemplo:.

if (o is string) 
{ do something } 

Ahora se puede tratar la referencia como una cadena en lugar de un objeto, por ejemplo una cadena tiene una longitud (pero no lo hace un objeto), por lo que se puede decir:.

Console.WriteLine("Length of string is " + greeting.length); 

que no se puede hacer con un objeto

0

Además, si estás lanzando de forma explícita, se puede aprovechar la coincidencia de patrones Si usted tiene un objeto. :

object aObject = "My string value"; 

se puede lanzar con seguridad el objeto como una cadena en una sola línea:

if (aObject is string aString) 
{ 
    Console.WriteLine("aString = " + aString) 
    // Output: "aString = My string value" 
} 

uso de este, junto con un invertida sentencia if, se puede lanzar con seguridad tipos, y fallar antes de tiempo si es necesario:

public void Conversion(object objA, object objB) 
{ 
    // Fail out early if the objects provided are not the correct type, or are null 
    if (!(objA is string str) || !(objB is int num)) { return; } 

    // Now, you have `str` and `num` that are safely cast, non-null variables 
    // all while maintaining the same scope as your Conversion method 
    Console.WriteLine("str.Length is " + str.Length); 
    Console.WriteLine("num is " + num); 
}