Compartir a través de


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:

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.

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))