He estado trabajando en algún código por un tiempo. Y tenía una pregunta: ¿Cuál es la diferencia entre el casting, el análisis sintáctico y la conversión? ¿Y cuándo podemos usarlos?Diferencia entre conversión, análisis y conversión
Respuesta
Casting es cuando toma una variable de un tipo y la cambia a un tipo diferente. Sólo se puede hacer que en algunos casos, así:
string str = "Hello";
object o = str;
string str2 = (string)o; // <-- This is casting
casting tiene valor no cambio de la variable de - el valor sigue siendo del mismo tipo (la cadena "Hola").
de conversión es cuando se toma un valor de un tipo y lo convierten en un tipo diferente:
double d = 5.5;
int i = (int)d; // <---- d was converted to an integer
Tenga en cuenta que en este caso, la conversión se realiza en forma de fundición.
El análisis está tomando una cadena y convirtiéndola en un tipo diferente al comprender su contenido. Por ejemplo, convertir la cadena "123" al número 123, o la cadena "Sábado, 22 de septiembre" a un DateTime.
fundición (casting para trabajar los tipos tienen que ser compatibles) La conversión entre tipos de datos que se puede hacer de forma explícita el uso de un molde
static void _Casting()
{
int i = 10;
float f = 0;
f = i; // An implicit conversion, no data will be lost.
f = 0.5F;
i = (int)f; // An explicit conversion. Information will be lost.
}
análisis sintáctico (Parsing es la conversión entre diferentes tipos :) convierte un tipo a otro tipo puede ser llamado como uisng análisis int.parse
int num = int.Parse("500");
atravesar por los elementos de datos como XML pueden también llamado como el análisis
Cuando se involucran las conversiones definidas por el usuario, esto generalmente implica la devolución de un objeto/valor diferente. las conversiones definidas por el usuario generalmente existen entre tipos de valores en lugar de tipos de referencia, por lo que esto rara vez es un problema.
convertir Uso de la clase Convertir en realidad sólo le ayuda a analizarlo
para más consulte http://msdn.microsoft.com/en-us/library/ms228360%28VS.80%29.aspx
Alguna información ligeramente incorrecta aquí. 'Casting' solo debería tratar el objeto existente como un tipo diferente (suponiendo que sea un upcast/downcast compatible) y no convertir datos en un nuevo objeto. Su ejemplo es en realidad crear nuevos objetos/datos. Las "conversiones implícitas" _no deberían resultar en una pérdida de datos, pero eso no está garantizado cuando se trata de conversiones definidas por el usuario. 'Parsing' es típicamente estrictamente de una representación de 'cadena' a un objeto equivalente y no de" un tipo a otro tipo "en general. Las conversiones pueden ser tan comunes para los tipos de referencia como los tipos de valor. –
@ChrisSinclair Creo que tienes que echar un vistazo profundo a http://msdn.microsoft.com/en-us/library/ms228360%28VS.80%29.aspx – cc4re
Estos son tres términos, cada uno con usos específicos:
- de fundición - el cambio de una
type
a otro. Para hacer esto, los tipos deben ser compatibles:int
->object
;IList<T>
->IEnumerable<T>
- de análisis - por lo general se refiere a la lectura de las cadenas y la extracción de partes útiles
- de conversión - similar a la fundición, pero típicamente una conversión implicaría cambiar un tipo a un tipo compatible no lo contrario. Un ejemplo de eso sería convertir objetos en cadenas.
Una conversión de un tipo a otro requiere alguna forma de compatibilidad, generalmente a través de la herencia o la implementación de una interfaz.De fundición puede ser implícito o explícito:
class Foo : IFoo {
// implementations
}
// implicit cast
public IFoo GetFoo() {
return Foo;
}
// explicit cast
public IFoo GetFoo() {
return Foo as IFoo;
}
Hay bastantes maneras de analizar. Leemos sobre el análisis de XML; algunos tipos tienen los métodos Parse
y TryParse
; y luego hay veces que necesitamos analizar cadenas u otros tipos para extraer las 'cosas que nos importan'.
int.Parse("3") // returns an integer value of 3
int.TryParse("foo", out intVal) // return true if the string could be parsed; otherwise false
La conversión puede implicar el cambio de un tipo a otro incompatible. Esto podría implicar algunos análisis también. Los ejemplos de conversión suelen ser, IMO, muy vinculados a contextos específicos.
casting: indica al compilador que un objeto es realmente algo sin cambiarlo (aunque algunos la pérdida de datos puede incurrir).
object obj_s= "12345";
string str_i = (string) obj; // "12345" as string, explicit
int small = 12345;
long big = 0;
big = small; // 12345 as long, implicit
Analizar: Contar el programa de interpretar (en tiempo de ejecución) una cadena.
string int_s = "12345";
int i = int.Parse(int_s); // 12345 as int
conversión de: Decir que el programa utilice construido en métodos para tratar de cambiar el tipo de lo que puede ser no simplemente intercambiables.
double dub = 123.45;
int i = System.Convert.ToInt32(dub); // 123 as int
No puedes convertir implícitamente un 'doble' a un 'int' ya que hay (típicamente) una pérdida de información. Se requiere una conversión explícita para que 'i = dub' no se compile. Además, las _conversions_ implícitas son _no_casting. Crean nuevos datos/objetos. Un ejemplo _cast_ "implícito" estaría elevando una subclase a su clase base. –
desde http: // stackoverflow.com/a/4181954/1615483 (en doble a int); "puedes usar ** cast ** si quieres el comportamiento truncado-hacia-cero predeterminado" –
Editaré para 'int' a' long', de modo que no hay duda, –
Esta pregunta es realmente muy complicado ...
Normalmente, un fundido simplemente indica al tiempo de ejecución para cambiar un tipo a otro. Estos deben ser tipos que sean compatibles. Por ejemplo, un int
siempre se puede representar como long
, por lo que puede enviarlo a long
. Algunos yesos tienen efectos secundarios. Por ejemplo, un float
disminuirá su precisión si se lanza a int
. Por lo tanto, (int)1.5f
dará como resultado el valor int 1. Los lanzamientos suelen ser la forma más rápida de cambiar el tipo, ya que es un único operador de IL. Por ejemplo, el código:
public void CastExample()
{
int i = 7;
long l = (long)i;
}
Realiza el molde mediante la ejecución del código IL:
conv.i8 //convert to 8-byte integer (a.k.a. Int64, a.k.a. long).
A de análisis sintáctico es alguna función que toma en una vez tipo y devuelve otro. Es una función de código real, no solo un operador IL. Esto normalmente demora más en ejecutarse, ya que ejecuta varias líneas de código.
Por ejemplo, este código:
public void ParseExample()
{
string s = "7";
long l = long.Parse(s);
}
ejecuta el código IL:
call int64 [mscorlib]System.Int64::Parse(string)
En otras palabras, se llama a un método real. Internamente, el tipo Int64 proporciona ese método:
public static long Parse(String s) {
return Number.ParseInt64(s, NumberStyles.Integer, NumberFormatInfo.CurrentInfo);
}
Y Number.Parse:
[System.Security.SecuritySafeCritical] // auto-generated
internal unsafe static Int64 ParseInt64(String value, NumberStyles options, NumberFormatInfo numfmt) {
Byte * numberBufferBytes = stackalloc Byte[NumberBuffer.NumberBufferBytes];
NumberBuffer number = new NumberBuffer(numberBufferBytes);
Int64 i = 0;
StringToNumber(value, options, ref number, numfmt, false);
if ((options & NumberStyles.AllowHexSpecifier) != 0) {
if (!HexNumberToInt64(ref number, ref i)) {
throw new OverflowException(Environment.GetResourceString("Overflow_Int64"));
}
}
else {
if (!NumberToInt64(ref number, ref i)) {
throw new OverflowException(Environment.GetResourceString("Overflow_Int64"));
}
}
return i;
}
Y así sucesivamente ...para que pueda ver que en realidad está haciendo mucho código.
Ahora donde las cosas se ponen más complicadas es que a pesar de un reparto suele ser el más rápido, las clases sustituyan los operadores de conversión implícita y explícita. Por ejemplo, si escribo la clase:
public class CastableClass
{
public int IntValue { get; set; }
public static explicit operator int(CastableClass castable)
{
return castable.IntValue;
}
}
he anulado el operador de conversión explícita para int
, así que ahora puedo hacer:
public void OverridedCastExample()
{
CastableClass cc = new CastableClass {IntValue = 7};
int i = (int)cc;
}
Qué ve como un molde normal, pero en realidad llama a mi método que definí en mi clase. El código IL es:
call int32 UnitTestProject1.CastableClass::op_Explicit(class UnitTestProject1.CastableClass)
Así que de todos modos, normalmente desea echar siempre que pueda. Luego analiza si no puedes.
+1: ejemplos muy bonitos y detallados. – IAbstract
Casting: o analizar
un elenco explícitamente invoca el operador de conversión de un tipo a otro. Variables de conversión no es simple. Un conjunto complicado de reglas resuelve moldes. En algunos casos, los datos se pierden y el lanzamiento no se puede revertir. En otros, se provoca una excepción en el motor de ejecución. int.Parse
es el método más simple pero arroja excepciones sobre la entrada no válida.
int.TryParse
es uno de los métodos más útiles para el análisis de los números enteros en el lenguaje C#. Este método funciona de la misma manera que int.Parse
. int.TryParse
ha intentado y atrapa la estructura adentro. Por lo tanto, no lanza excepciones
Convierte un tipo de datos base a otro tipo de datos base. Convert.ToInt32, junto con sus hermanos Convert.ToInt16 y Convert.ToInt64, es en realidad un método de envoltura estático para el método int.Parse.
El uso de TryParse
en lugar de Convert
o Cast
es recomendado por muchos programadores.
fuente: www.dotnetperls.com
'TryParse' no es confuso y sigue el mismo patrón que el' TryGetValue' del diccionario. Además, 'TryParse' lanzará una excepción si la entrada de cadena es nula o está vacía. – IAbstract
Gracias verificado. @ | Resumen –
Diferentes personas lo utilizan para significar cosas diferentes. No es necesario que sea cierto fuera del mundo .net, pero esto es lo que he entendido en .net context reading Blogs de Eric Lippert:
Todas las transformaciones de tipos de una forma a otra se pueden llamar conversion. Una forma de categorización puede ser
implícita -
a.representación cambiar (también llamado coacción)
int i = 0; double d = i; object o = i; // (specifically called boxing conversion) IConvertible o = i; // (specifically called boxing conversion)
Requiere operador de conversión implícita, la conversión siempre tiene éxito (operador de conversión implícita nunca debe tirar), cambia la identidad referencial del objeto que está siendo convertido.
b. representación preservar (también llamado conversión referencia implícita)
string s = ""; object o = s; IList<string> l = new List<string>();
Sólo válido para los tipos de referencia, nunca cambia la identidad de referencia del objeto que se convierte, la conversión siempre tiene éxito, garantizado en tiempo de compilación, no hay controles de tiempo de ejecución.
explícita (también llamada casting) -
a. representación cambiar
int i = 0; enum e = (enum)i; object o = i; i = (int)o; // (specifically called unboxing conversion)
Requiere operador de conversión explícita, cambia la identidad referencial del objeto que está siendo convertido, la conversión puede o no puede tener éxito, hace de verificación de tiempo de ejecución para la compatibilidad.
b. representación preservar (también llamado conversión referencia explícita)
object o = ""; string s = (string)o;
Sólo es válido para los tipos de referencia, nunca cambia la identidad referencial del objeto que está siendo convertida, conversión puede o no puede tener éxito, hace tiempo de ejecución de verificación de la compatibilidad.
Mientras que las conversiones son nivel de idioma construcciones, Analizar es una cosa muy diferente en el sentido de que es nivel del marco, o en otras palabras, son métodos personalizados escritas para obtener una salida de una entrada, como int.Parse
que toma en string
y devuelve int
.
- 1. ¿Hay alguna diferencia entre conversión de tipo y conversión de tipo?
- 2. ¿Cuál es la diferencia entre el casting y la conversión?
- 3. Conversión entre SQL char y C#
- 4. conversión entre matriz OpenCV y matriz int
- 5. Common Lisp: conversión entre listas y matrices
- 6. Conversión simple entre java.util.Date y XMLGregorianCalendar
- 7. Android: conversión entre Strings, SpannedStrings y Spannablestrings
- 8. Diferencia entre los métodos de conversión/fundición en C#
- 9. Conversión entre enumeraciones en C#
- 10. Conversión entre tipos en Haskell
- 11. ¿Diferencia entre el análisis y el paso?
- 12. Conversión numérica
- 13. Conversión entre zonas horarias en PHP
- 14. ¿Hay alguna diferencia entre el método ToString y la conversión a la cadena?
- 15. Cuál es la diferencia entre la conversión usando (Object como TClass) y TClass (Object)
- 16. Conversión implícita entre los tipos de datos
- 17. Conversión de Enum entre los módulos
- 18. Conversión/análisis programático de código LaTeX a texto sin formato
- 19. C#: ¿Sin conversión implícita entre 'expresión lambda' y 'expresión lambda'?
- 20. Conversión eficiente entre vectores en caja y sin caja
- 21. Conversión entre C++ std :: vector y C array sin copiar
- 22. Conversión entre espacios de color RGB y RYB
- 23. Conversión de árbol de conversión de lambda
- 24. Herencia y conversión en Java
- 25. nsstring y const char * conversión
- 26. conversión wav-a-midi
- 27. Diferencia entre WinMain y wWinMain
- 28. Conversión de std :: string a mayúsculas: ¿diferencia de rendimiento importante?
- 29. Conversión insegura
- 30. conversión CLLocationDistance
Solo para elaborar: También tenga en cuenta que no todos los modelos son válidos, depende de si los tipos son compatibles por herencia. Si se define un operador de conversión, eso pasaría a la conversión, incluso si se parece a la conversión. –
Hola. Solo me preguntaba, ¿sabes cuál es más rápido? – fungusanthrax