Clase System.Convert
En este artículo se proporcionan comentarios adicionales a la documentación de referencia de esta API.
La clase estática Convert contiene métodos que se usan principalmente para admitir la conversión a y desde los tipos de datos base de .NET. Los tipos base admitidos son Boolean, Char, SByte, Int16UInt16UInt64Int64ByteInt32UInt32, Single, , Double, y . DecimalDateTime String Además, la Convert clase incluye métodos para admitir otros tipos de conversiones.
Conversiones hacia y desde tipos base
Existe un método de conversión para convertir todos los tipos base en todos los demás tipos base. Sin embargo, la llamada real a un método de conversión determinado puede producir uno de cinco resultados, según el valor del tipo base en tiempo de ejecución y el tipo base de destino. Estos cinco resultados son:
Sin conversión. Esto ocurre cuando se intenta convertir de un tipo a sí mismo (por ejemplo, llamando a Convert.ToInt32(Int32) con un argumento de tipo Int32). En este caso, el método simplemente devuelve una instancia del tipo original.
Un valor de tipo InvalidCastException. Esto ocurre cuando no se admite una conversión determinada. InvalidCastException Se produce una excepción para las conversiones siguientes:
FormatException. Esto ocurre cuando se produce un error en el intento de convertir un valor de cadena en cualquier otro tipo base porque la cadena no tiene el formato adecuado. La excepción se produce para las conversiones siguientes:
- Una cadena que se va a convertir en un Boolean valor no es igual Boolean.TrueString o Boolean.FalseString.
- Una cadena que se va a convertir en un Char valor consta de varios caracteres.
- Una cadena que se va a convertir a cualquier tipo numérico no se reconoce como un número válido.
- Una cadena que se va a convertir a no DateTime se reconoce como un valor de fecha y hora válidos.
Una conversión correcta. Para las conversiones entre dos tipos base diferentes no enumerados en los resultados anteriores, todas las conversiones de ampliación, así como todas las conversiones de restricción que no dan lugar a una pérdida de datos se realizarán correctamente y el método devolverá un valor del tipo base de destino.
Un valor de tipo OverflowException. Esto ocurre cuando una conversión de restricción produce una pérdida de datos. Por ejemplo, al intentar convertir una Int32 instancia cuyo valor es 10000 a un Byte tipo, se produce porque OverflowException 10000 está fuera del intervalo del Byte tipo de datos.
No se producirá una excepción si la conversión de un tipo numérico produce una pérdida de precisión (es decir, la pérdida de algunos dígitos menos significativos). Sin embargo, se producirá una excepción si el resultado es mayor que el que puede representar el tipo de valor devuelto del método de conversión determinado.
Por ejemplo, cuando se convierte en Double , Singlepuede producirse una pérdida de precisión, pero no se produce ninguna excepción. Sin embargo, si la magnitud de Double es demasiado grande para representarse mediante , Singlese produce una excepción de desbordamiento.
Números no decimales
La Convert clase incluye métodos estáticos a los que se puede llamar para convertir valores enteros en representaciones de cadena no decimales y convertir cadenas que representan números no decimales a valores enteros. Cada uno de estos métodos de conversión incluye un base
argumento que permite especificar el sistema numérico; binario (base 2), octal (base 8) y hexadecimal (base 16), así como decimal (base 10). Hay un conjunto de métodos para convertir cada uno de los tipos enteros primitivos compatibles con CLS en una cadena y uno para convertir una cadena en cada uno de los tipos enteros primitivos:
ToString(Byte, Int32) y ToByte(String, Int32), para convertir un valor de byte en y desde una cadena en una base especificada.
ToString(Int16, Int32) y ToInt16(String, Int32), para convertir un entero de 16 bits con signo a y desde una cadena en una base especificada.
ToString(Int32, Int32) y ToInt32(String, Int32), para convertir un entero de 32 bits con signo en y desde una cadena en una base especificada.
ToString(Int64, Int32) y ToInt64(String, Int32), para convertir un entero de 64 bits con signo a y desde una cadena en una base especificada.
ToSByte(String, Int32), para convertir la representación de cadena de un valor de byte en un formato especificado a un byte firmado.
ToUInt16(String, Int32), para convertir la representación de cadena de un entero en un formato especificado a un entero de 16 bits sin signo.
ToUInt32(String, Int32), para convertir la representación de cadena de un entero en un formato especificado a un entero de 32 bits sin signo.
ToUInt64(String, Int32), para convertir la representación de cadena de un entero en un formato especificado a un entero de 64 bits sin signo.
En el ejemplo siguiente se convierte el valor de Int16.MaxValue en una cadena en todos los formatos numéricos admitidos. A continuación, vuelve a convertir el valor de cadena en un Int16 valor.
using System;
public class Example
{
public static void Main()
{
int[] baseValues = { 2, 8, 10, 16 };
short value = Int16.MaxValue;
foreach (var baseValue in baseValues) {
String s = Convert.ToString(value, baseValue);
short value2 = Convert.ToInt16(s, baseValue);
Console.WriteLine("{0} --> {1} (base {2}) --> {3}",
value, s, baseValue, value2);
}
}
}
// The example displays the following output:
// 32767 --> 111111111111111 (base 2) --> 32767
// 32767 --> 77777 (base 8) --> 32767
// 32767 --> 32767 (base 10) --> 32767
// 32767 --> 7fff (base 16) --> 32767
open System
let baseValues = [ 2; 8; 10; 16 ]
let value = Int16.MaxValue
for baseValue in baseValues do
let s = Convert.ToString(value, baseValue)
let value2 = Convert.ToInt16(s, baseValue)
printfn $"{value} --> {s} (base {baseValue}) --> {value2}"
// The example displays the following output:
// 32767 --> 111111111111111 (base 2) --> 32767
// 32767 --> 77777 (base 8) --> 32767
// 32767 --> 32767 (base 10) --> 32767
// 32767 --> 7fff (base 16) --> 32767
Module Example2
Public Sub Main()
Dim baseValues() As Integer = {2, 8, 10, 16}
Dim value As Short = Int16.MaxValue
For Each baseValue In baseValues
Dim s As String = Convert.ToString(value, baseValue)
Dim value2 As Short = Convert.ToInt16(s, baseValue)
Console.WriteLine("{0} --> {1} (base {2}) --> {3}",
value, s, baseValue, value2)
Next
End Sub
End Module
' The example displays the following output:
' 32767 --> 111111111111111 (base 2) --> 32767
' 32767 --> 77777 (base 8) --> 32767
' 32767 --> 32767 (base 10) --> 32767
' 32767 --> 7fff (base 16) --> 32767
Conversiones de objetos personalizados a tipos base
Además de admitir conversiones entre los tipos base, el método admite la Convert conversión de cualquier tipo personalizado a cualquier tipo base. Para ello, el tipo personalizado debe implementar la IConvertible interfaz , que define los métodos para convertir el tipo de implementación en cada uno de los tipos base. Las conversiones que no son compatibles con un tipo determinado deben producir una InvalidCastExceptionexcepción .
Cuando el ChangeType método se pasa un tipo personalizado como primer parámetro, o cuando se llama alConvert.To
método Type (por Convert.ToInt32(Object) ejemplo, o Convert.ToDouble(Object, IFormatProvider) se llama a y se pasa una instancia de un tipo personalizado como primer parámetro, el Convert método, a su vez, llama a la implementación del IConvertible tipo personalizado para realizar la conversión. Para obtener más información, consulte Conversión de tipos en .NET.
Información de formato específica de la referencia cultural
Todos los métodos de conversión de tipos base y el ChangeType método incluyen sobrecargas que tienen un parámetro de tipo IFormatProvider. Por ejemplo, el Convert.ToBoolean método tiene las dos sobrecargas siguientes:
El IFormatProvider parámetro puede proporcionar información de formato específica de la referencia cultural para ayudar al proceso de conversión. Sin embargo, la mayoría de los métodos de conversión de tipos base omiten. Solo lo usan los siguientes métodos de conversión de tipos base. Si se pasa un null
IFormatProvider argumento a estos métodos, se usa el CultureInfo objeto que representa la referencia cultural actual.
Por métodos que convierten un valor en un tipo numérico. La IFormatProvider sobrecarga usa el parámetro que tiene parámetros de tipo String y IFormatProvider. También lo usa la sobrecarga que tiene parámetros de tipo Object y IFormatProvider si el tipo en tiempo de ejecución del objeto es .String
Por métodos que convierten un valor en una fecha y hora. La IFormatProvider sobrecarga usa el parámetro que tiene parámetros de tipo String y IFormatProvider. También lo usa la sobrecarga que tiene parámetros de tipo Object y IFormatProvider si el tipo en tiempo de ejecución del objeto es .String
Por las Convert.ToString sobrecargas que incluyen un IFormatProvider parámetro y que convierten un valor numérico en una cadena o un DateTime valor en una cadena.
Sin embargo, cualquier tipo definido por el usuario que implemente IConvertible puede usar el IFormatProvider parámetro .
Codificación base64
La codificación Base64 convierte los datos binarios en una cadena. Los datos expresados como dígitos base-64 se pueden transmitir fácilmente a través de canales de datos que solo pueden transmitir caracteres de 7 bits. La Convert clase incluye los métodos siguientes para admitir la codificación base64: un conjunto de métodos admite la conversión de una matriz de bytes a y desde una String matriz de caracteres Unicode que constan de caracteres base-64 dígitos.
- ToBase64String, que convierte una matriz de bytes en una cadena codificada en base64.
- ToBase64CharArray, que convierte una matriz de bytes en una matriz de caracteres codificada en base64.
- FromBase64String, que convierte una cadena codificada en base64 en una matriz de bytes.
- FromBase64CharArray, que convierte una matriz de caracteres codificada en base64 en una matriz de bytes.
Otras conversiones comunes
Puede usar otras clases de .NET para realizar algunas conversiones que no son compatibles con los métodos estáticos de la Convert clase . Entre ellas se incluyen las siguientes:
Conversión a matrices de bytes
La BitConverter clase proporciona métodos que convierten los tipos numéricos primitivos (incluidos Boolean) en matrices de bytes y de matrices de bytes a tipos de datos primitivos.
Codificación y descodificación de caracteres
La Encoding clase y sus clases derivadas (como UnicodeEncoding y UTF8Encoding) proporcionan métodos para codificar una matriz de caracteres o una cadena (es decir, convertirlas en una matriz de bytes en una codificación determinada) y para descodificar una matriz de bytes codificada (es decir, convertir una matriz de bytes de nuevo a caracteres Unicode codificados en UTF16). Para obtener más información, vea Codificación de caracteres en .NET.
Ejemplos
En el ejemplo siguiente se muestran algunos de los métodos de conversión de la Convert clase , incluidos ToInt32, ToBooleany ToString.
double dNumber = 23.15;
try {
// Returns 23
int iNumber = System.Convert.ToInt32(dNumber);
}
catch (System.OverflowException) {
System.Console.WriteLine(
"Overflow in double to int conversion.");
}
// Returns True
bool bNumber = System.Convert.ToBoolean(dNumber);
// Returns "23.15"
string strNumber = System.Convert.ToString(dNumber);
try {
// Returns '2'
char chrNumber = System.Convert.ToChar(strNumber[0]);
}
catch (System.ArgumentNullException) {
System.Console.WriteLine("String is null");
}
catch (System.FormatException) {
System.Console.WriteLine("String length is greater than 1.");
}
// System.Console.ReadLine() returns a string and it
// must be converted.
int newInteger = 0;
try {
System.Console.WriteLine("Enter an integer:");
newInteger = System.Convert.ToInt32(
System.Console.ReadLine());
}
catch (System.ArgumentNullException) {
System.Console.WriteLine("String is null.");
}
catch (System.FormatException) {
System.Console.WriteLine("String does not consist of an " +
"optional sign followed by a series of digits.");
}
catch (System.OverflowException) {
System.Console.WriteLine(
"Overflow in string to int conversion.");
}
System.Console.WriteLine("Your integer as a double is {0}",
System.Convert.ToDouble(newInteger));
let dNumber = 23.15
try
// Returns 23
Convert.ToInt32 dNumber
|> ignore
with :? OverflowException ->
printfn "Overflow in double to int conversion."
// Returns True
let bNumber = System.Convert.ToBoolean dNumber
// Returns "23.15"
let strNumber = System.Convert.ToString dNumber
try
// Returns '2'
System.Convert.ToChar strNumber[0]
|> ignore
with
| :? ArgumentNullException ->
printfn "String is null"
| :? FormatException ->
printfn "String length is greater than 1."
// System.Console.ReadLine() returns a string and it
// must be converted.
let newInteger =
try
printfn "Enter an integer:"
System.Convert.ToInt32(Console.ReadLine())
with
| :? ArgumentNullException ->
printfn "String is null."
0
| :? FormatException ->
printfn "String does not consist of an optional sign followed by a series of digits."
0
| :? OverflowException ->
printfn "Overflow in string to int conversion."
0
printfn $"Your integer as a double is {System.Convert.ToDouble newInteger}"
Dim dNumber As Double
dNumber = 23.15
Try
' Returns 23
Dim iNumber As Integer
iNumber = System.Convert.ToInt32(dNumber)
Catch exp As System.OverflowException
System.Console.WriteLine("Overflow in double to int conversion.")
End Try
' Returns True
Dim bNumber As Boolean
bNumber = System.Convert.ToBoolean(dNumber)
' Returns "23.15"
Dim strNumber As String
strNumber = System.Convert.ToString(dNumber)
Try
' Returns '2'
Dim chrNumber As Char
chrNumber = System.Convert.ToChar(strNumber.Chars(1))
Catch exp As System.ArgumentNullException
System.Console.WriteLine("String is null.")
Catch exp As System.FormatException
System.Console.WriteLine("String length is greater than 1.")
End Try
' System.Console.ReadLine() returns a string and it
' must be converted.
Dim newInteger As Integer
newInteger = 0
Try
System.Console.WriteLine("Enter an integer:")
newInteger = System.Convert.ToInt32(System.Console.ReadLine())
Catch exp As System.ArgumentNullException
System.Console.WriteLine("String is null.")
Catch exp As System.FormatException
System.Console.WriteLine("String does not consist of an " + _
"optional sign followed by a series of digits.")
Catch exp As System.OverflowException
System.Console.WriteLine("Overflow in string to int conversion.")
End Try
System.Console.WriteLine("Your integer as a double is {0}", _
System.Convert.ToDouble(newInteger))