Classe System.Convert
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 dar suporte à conversão de e para os tipos de dados base no .NET. Os tipos de base suportados são Boolean, Char, SByte, Int32Int16UInt16UInt32UInt64Int64ByteDoubleDecimalSingleDateTime e .String Além disso, a Convert classe inclui métodos para dar suporte a outros tipos de conversões.
Conversões de e para tipos base
Existe um método de conversão para converter todos os tipos base em todos os outros tipos 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 é feita uma tentativa de 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 em 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 string a ser convertida em um Boolean valor não é igual a Boolean.TrueString 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 válido de data e hora.
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 restrição que não resultem em perda de dados, serão bem-sucedidas e o método retornará um valor do tipo de base de destino.
Um OverflowException. Isso ocorre quando uma conversão de restrição resulta em perda de dados. Por exemplo, tentar converter uma Int32 instância cujo valor é 10000 em um Byte tipo gera 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 retornado do método de conversão específico.
Por exemplo, quando a 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 será 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 com sinal 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 com sinal 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 sem sinal.
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 sem sinal.
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 sem sinal.
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, ele 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 dar suporte a conversões entre os tipos base, o Convert método dá 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 em cada um dos tipos base. As conversões que não são suportadas por um tipo específico devem gerar um InvalidCastException.
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) or 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 no 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 String.
Por métodos que convertem um valor em uma 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 String.
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 implemente IConvertible pode usar o IFormatProvider parâmetro.
Codificação Base64
A codificação Base64 converte dados binários em uma string. Os dados expressos como dígitos de base 64 podem ser facilmente transmitidos por canais de dados que só podem transmitir caracteres de 7 bits. A Convert classe inclui os seguintes métodos para dar suporte à codificação base64: Um conjunto de métodos dá suporte à conversão de uma matriz de bytes de e para ou String para e de uma matriz de caracteres Unicode que consiste em caracteres de base de 64 dígitos.
- 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 têm suporte 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 em 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, para convertê-los em uma matriz de bytes em uma codificação específica) e para decodificar uma matriz de bytes codificada (ou seja, converter uma matriz de bytes de volta em 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, ToBoolean, e 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))