System.Convert classe
Este artigo fornece observações complementares à documentação de referência para essa API.
A classe estática Convert contém métodos que são usados principalmente para oferecer suporte à conversão de e para os tipos de dados base no .NET. Os tipos base suportados são Boolean, Char, SByte, Byte, Int32Int64Int16UInt16, UInt32, UInt64, DoubleDecimalSingleDateTime e .String Além disso, a Convert classe inclui métodos para oferecer suporte a outros tipos de conversões.
Conversões de e para tipos de base
Existe um método de conversão para converter cada tipo base em qualquer outro tipo base. No entanto, a chamada real para um método de conversão específico pode produzir um dos cinco resultados, dependendo do valor do tipo base em tempo de execução e do tipo base de destino. Esses cinco resultados são:
Sem conversão. Isso ocorre quando uma tentativa é feita para converter de um tipo para si mesmo (por exemplo, chamando Convert.ToInt32(Int32) com um argumento do tipo Int32). Nesse caso, o método simplesmente retorna uma instância do tipo original.
Um InvalidCastException. Isso ocorre quando uma conversão específica não é suportada. Um InvalidCastException é lançado para as seguintes conversões:
Um FormatException. Isso ocorre quando a tentativa de converter um valor de cadeia de caracteres para qualquer outro tipo base falha porque a cadeia de caracteres não está no formato adequado. A exceção é lançada para as seguintes conversões:
- Uma cadeia de caracteres a ser convertida em um Boolean valor não é igual Boolean.TrueString a ou Boolean.FalseString.
- Uma cadeia de caracteres a ser convertida em um Char valor consiste em vários caracteres.
- Uma cadeia de caracteres a ser convertida em qualquer tipo numérico não é reconhecida como um número válido.
- Uma cadeia de caracteres a ser convertida em um DateTime não é reconhecida como um valor de data e hora válido.
Uma conversão bem-sucedida. Para conversões entre dois tipos de base diferentes não listados nos resultados anteriores, todas as conversões de ampliação, bem como todas as conversões de estreitamento que não resultam em perda de dados, serão bem-sucedidas e o método retornará um valor do tipo base de destino.
Um OverflowException. Isso ocorre quando uma conversão de estreitamento resulta em uma perda de dados. Por exemplo, tentar converter uma Int32 instância cujo valor é 10000 em um Byte tipo lança um OverflowException porque 10000 está fora do intervalo do tipo de Byte dados.
Uma exceção não será lançada se a conversão de um tipo numérico resultar em uma perda de precisão (ou seja, a perda de alguns dígitos menos significativos). No entanto, uma exceção será lançada se o resultado for maior do que pode ser representado pelo tipo de valor de retorno do método de conversão específico.
Por exemplo, quando um Double é convertido em um Single, pode ocorrer uma perda de precisão, mas nenhuma exceção é lançada. No entanto, se a magnitude do for muito grande para ser representada por um Single, uma exceção de Double estouro é lançada.
Números não decimais
A Convert classe inclui métodos estáticos que você pode chamar para converter valores integrais em representações de cadeia de caracteres não decimais e para converter cadeias de caracteres que representam números não decimais em valores integrais. Cada um desses métodos de conversão inclui um base
argumento que permite especificar o sistema numérico: binário (base 2), octal (base 8) e hexadecimal (base 16), bem como decimal (base 10). Há um conjunto de métodos para converter cada um dos tipos integrais primitivos compatíveis com CLS em uma cadeia de caracteres e um para converter uma cadeia de caracteres em cada um dos tipos integrais primitivos:
ToString(Byte, Int32) e ToByte(String, Int32), para converter um valor de byte de e para uma cadeia de caracteres em uma base especificada.
ToString(Int16, Int32) e ToInt16(String, Int32), para converter um inteiro assinado de 16 bits de e para uma cadeia de caracteres em uma base especificada.
ToString(Int32, Int32) e ToInt32(String, Int32), para converter um inteiro assinado de 32 bits de e para uma cadeia de caracteres em uma base especificada.
ToString(Int64, Int32) e ToInt64(String, Int32), para converter um inteiro assinado de 64 bits de e para uma cadeia de caracteres em uma base especificada.
ToSByte(String, Int32), para converter a representação de cadeia de caracteres de um valor de byte em um formato especificado em um byte assinado.
ToUInt16(String, Int32), para converter a representação de cadeia de caracteres de um inteiro em um formato especificado em um inteiro de 16 bits não assinado.
ToUInt32(String, Int32), para converter a representação de cadeia de caracteres de um inteiro em um formato especificado em um inteiro de 32 bits não assinado.
ToUInt64(String, Int32), para converter a representação de cadeia de caracteres de um inteiro em um formato especificado em um inteiro de 64 bits não assinado.
O exemplo a seguir converte o valor de em uma cadeia de Int16.MaxValue caracteres em todos os formatos numéricos com suporte. Em seguida, converte o valor da cadeia de caracteres de volta em um 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
Conversões de objetos personalizados para tipos base
Além de oferecer suporte a conversões entre os tipos base, o Convert método oferece suporte à conversão de qualquer tipo personalizado em qualquer tipo base. Para fazer isso, o tipo personalizado deve implementar a IConvertible interface, que define métodos para converter o tipo de implementação para cada um dos tipos base. As conversões que não são suportadas por um tipo específico devem lançar um InvalidCastExceptionarquivo .
Quando o ChangeType método é passado um tipo personalizado como seu primeiro parâmetro, ou quando o Convert.To
método Type (como Convert.ToInt32(Object) ou Convert.ToDouble(Object, IFormatProvider) é chamado e passado uma instância de um tipo personalizado como seu primeiro parâmetro, o Convert método, por sua vez, chama a implementação do IConvertible tipo personalizado para executar a conversão. Para obter mais informações, confira Conversão de tipo no .NET.
Informações de formatação específicas da cultura
Todos os métodos de conversão de tipo base e o ChangeType método incluem sobrecargas que têm um parâmetro do tipo IFormatProvider. Por exemplo, o Convert.ToBoolean método tem as duas sobrecargas a seguir:
O IFormatProvider parâmetro pode fornecer informações de formatação específicas da cultura para auxiliar o processo de conversão. No entanto, ele é ignorado pela maioria dos métodos de conversão de tipo base. Ele é usado apenas pelos seguintes métodos de conversão de tipo base. Se um null
IFormatProvider argumento for passado para esses métodos, o CultureInfo objeto que representa a cultura atual será usado.
Por métodos que convertem um valor em um tipo numérico. O IFormatProvider parâmetro é usado pela sobrecarga que tem parâmetros do tipo String e IFormatProvider. Ele também é usado pela sobrecarga que tem parâmetros do tipo Object e IFormatProvider se o tipo de tempo de execução do objeto for um Stringarquivo .
Por métodos que convertem um valor em data e hora. O IFormatProvider parâmetro é usado pela sobrecarga que tem parâmetros do tipo String e IFormatProvider. Ele também é usado pela sobrecarga que tem parâmetros do tipo Object e IFormatProvider se o tipo de tempo de execução do objeto for um Stringarquivo .
Pelas Convert.ToString sobrecargas que incluem um IFormatProvider parâmetro e que convertem um valor numérico em uma cadeia de caracteres ou um DateTime valor em uma cadeia de caracteres.
No entanto, qualquer tipo definido pelo usuário que implementa IConvertible pode fazer uso do IFormatProvider parâmetro.
Codificação Base64
A codificação Base64 converte dados binários em uma cadeia de caracteres. Os dados expressos como dígitos de base 64 podem ser facilmente transmitidos através de canais de dados que só podem transmitir caracteres de 7 bits. A Convert classe inclui os seguintes métodos para oferecer suporte à codificação base64: Um conjunto de métodos oferece suporte à conversão de uma matriz de bytes de e para um String ou para e de uma matriz de caracteres Unicode que consiste em caracteres de dígitos de base 64.
- ToBase64String, que converte uma matriz de bytes em uma cadeia de caracteres codificada em base64.
- ToBase64CharArray, que converte uma matriz de bytes em uma matriz de caracteres codificada em base64.
- FromBase64String, que converte uma cadeia de caracteres codificada em base64 em uma matriz de bytes.
- FromBase64CharArray, que converte uma matriz de caracteres codificada em base64 em uma matriz de bytes.
Outras conversões comuns
Você pode usar outras classes .NET para executar algumas conversões que não são suportadas pelos métodos estáticos da Convert classe. Estão incluídos:
Conversão em matrizes de bytes
A BitConverter classe fornece métodos que convertem os tipos numéricos primitivos (incluindo Boolean) em matrizes de bytes e de matrizes de bytes de volta para tipos de dados primitivos.
Codificação e decodificação de caracteres
A Encoding classe e suas classes derivadas (como UnicodeEncoding e UTF8Encoding) fornecem métodos para codificar uma matriz de caracteres ou uma cadeia de caracteres (ou seja, convertê-los em uma matriz de bytes em uma codificação específica) e decodificar uma matriz de bytes codificada (ou seja, converter uma matriz de bytes de volta para caracteres Unicode codificados em UTF16). Para obter mais informações, consulte Codificação de caracteres no .NET.
Exemplos
O exemplo a seguir demonstra alguns dos métodos de conversão na Convert classe, incluindo ToInt32, ToBooleane 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))