Classe System.Convert
Questo articolo fornisce osservazioni supplementari alla documentazione di riferimento per questa API.
La classe statica Convert contiene metodi usati principalmente per supportare la conversione da e verso i tipi di dati di base in .NET. I tipi di base supportati sono , , Byte, , Int16, Int32, UInt16UInt64Int64UInt32DecimalSingleDoublee . DateTime StringSByteCharBoolean Inoltre, la Convert classe include metodi per supportare altri tipi di conversioni.
Conversioni da e verso tipi di base
Esiste un metodo di conversione per convertire ogni tipo di base in ogni altro tipo di base. Tuttavia, la chiamata effettiva a un metodo di conversione specifico può produrre uno dei cinque risultati, a seconda del valore del tipo di base in fase di esecuzione e del tipo di base di destinazione. Questi cinque risultati sono:
Nessuna conversione. Ciò si verifica quando viene effettuato un tentativo di conversione da un tipo a se stesso , ad esempio chiamando Convert.ToInt32(Int32) con un argomento di tipo Int32. In questo caso, il metodo restituisce semplicemente un'istanza del tipo originale.
Oggetto InvalidCastException. Ciò si verifica quando una particolare conversione non è supportata. Viene generata un'eccezione InvalidCastException per le conversioni seguenti:
Un oggetto FormatException. Ciò si verifica quando il tentativo di convertire un valore stringa in qualsiasi altro tipo di base ha esito negativo perché la stringa non è nel formato corretto. L'eccezione viene generata per le conversioni seguenti:
- Una stringa da convertire in un Boolean valore non è uguale Boolean.TrueString a o Boolean.FalseString.
- Una stringa da convertire in un Char valore è costituita da più caratteri.
- Una stringa da convertire in qualsiasi tipo numerico non viene riconosciuta come numero valido.
- Una stringa da convertire in un DateTime oggetto non viene riconosciuta come valore di data e ora valido.
Conversione riuscita. Per le conversioni tra due tipi di base diversi non elencati nei risultati precedenti, tutte le conversioni più grandi e tutte le conversioni di tipo narrowing che non comportano una perdita di dati avranno esito positivo e il metodo restituirà un valore del tipo di base di destinazione.
Oggetto OverflowException. Ciò si verifica quando una conversione verso un tipo di dati ristretto comporta una perdita di dati. Ad esempio, il tentativo di convertire un'istanza Int32 il cui valore è 10000 in un Byte tipo genera un'eccezione OverflowException perché 10000 non rientra nell'intervallo del Byte tipo di dati.
Un'eccezione non verrà generata se la conversione di un tipo numerico comporta una perdita di precisione, ovvero la perdita di alcune cifre meno significative. Tuttavia, verrà generata un'eccezione se il risultato è maggiore di quanto possa essere rappresentato dal tipo di valore restituito del metodo di conversione specifico.
Ad esempio, quando un Double oggetto viene convertito in , Singlepotrebbe verificarsi una perdita di precisione, ma non viene generata alcuna eccezione. Tuttavia, se la grandezza di Double è troppo grande per essere rappresentata da , Singleviene generata un'eccezione di overflow.
Numeri non decimali
La Convert classe include metodi statici che è possibile chiamare per convertire i valori integrali in rappresentazioni di stringa non decimali e per convertire stringhe che rappresentano numeri non decimali in valori integrali. Ognuno di questi metodi di conversione include un base
argomento che consente di specificare il sistema numerico, binario (base 2), ottale (base 8) ed esadecimale (base 16), nonché decimale (base 10). È disponibile un set di metodi per convertire ognuno dei tipi integrali primitivi conformi a CLS in una stringa e uno per convertire una stringa in ognuno dei tipi integrali primitivi:
ToString(Byte, Int32) e ToByte(String, Int32)per convertire un valore di byte in e da una stringa in una base specificata.
ToString(Int16, Int32) e ToInt16(String, Int32), per convertire un intero con segno a 16 bit in e da una stringa in una base specificata.
ToString(Int32, Int32) e ToInt32(String, Int32), per convertire un intero con segno a 32 bit in e da una stringa in una base specificata.
ToString(Int64, Int32) e ToInt64(String, Int32), per convertire un intero con segno a 64 bit in e da una stringa in una base specificata.
ToSByte(String, Int32)per convertire la rappresentazione di stringa di un valore di byte in un formato specificato in un byte firmato.
ToUInt16(String, Int32)per convertire la rappresentazione di stringa di un intero in un formato specificato in un intero senza segno a 16 bit.
ToUInt32(String, Int32)per convertire la rappresentazione di stringa di un intero in un formato specificato in un intero senza segno a 32 bit.
ToUInt64(String, Int32)per convertire la rappresentazione di stringa di un intero in un formato specificato in un intero senza segno a 64 bit.
Nell'esempio seguente il valore di viene Int16.MaxValue convertito in una stringa in tutti i formati numerici supportati. Converte quindi di nuovo il valore stringa in un Int16 valore.
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
Conversioni da oggetti personalizzati a tipi di base
Oltre a supportare le conversioni tra i tipi di base, il metodo supporta la Convert conversione di qualsiasi tipo personalizzato in qualsiasi tipo di base. A tale scopo, il tipo personalizzato deve implementare l'interfaccia IConvertible , che definisce i metodi per la conversione del tipo di implementazione in ognuno dei tipi di base. Le conversioni non supportate da un tipo specifico devono generare un'eccezione InvalidCastException.
Quando il ChangeType metodo viene passato un tipo personalizzato come primo parametro o quando viene chiamato il Convert.To
metodo Type , ad esempio Convert.ToInt32(Object) o e Convert.ToDouble(Object, IFormatProvider) passato un'istanza di un tipo personalizzato come primo parametro, il Convert metodo chiama a sua volta l'implementazione del IConvertible tipo personalizzato per eseguire la conversione. Per altre informazioni, vedere Conversione dei tipi in .NET.
Informazioni sulla formattazione specifiche delle impostazioni cultura
Tutti i metodi di conversione dei tipi di base e il ChangeType metodo includono overload con un parametro di tipo IFormatProvider. Ad esempio, il Convert.ToBoolean metodo ha i due overload seguenti:
Il IFormatProvider parametro può fornire informazioni di formattazione specifiche delle impostazioni cultura per facilitare il processo di conversione. Tuttavia, viene ignorato dalla maggior parte dei metodi di conversione dei tipi di base. Viene usato solo dai metodi di conversione dei tipi di base seguenti. Se a questi metodi viene passato un null
IFormatProvider argomento, viene utilizzato l'oggetto CultureInfo che rappresenta le impostazioni cultura correnti.
Per metodi che converte un valore in un tipo numerico. Il IFormatProvider parametro viene usato dall'overload con parametri di tipo String e IFormatProvider. Viene usato anche dall'overload con parametri di tipo Object e IFormatProvider se il tipo di runtime dell'oggetto è un oggetto String.
Per metodi che converte un valore in una data e un'ora. Il IFormatProvider parametro viene usato dall'overload con parametri di tipo String e IFormatProvider. Viene usato anche dall'overload con parametri di tipo Object e IFormatProvider se il tipo di runtime dell'oggetto è un oggetto String.
Convert.ToString Dagli overload che includono un IFormatProvider parametro e che converte un valore numerico in una stringa o un DateTime valore in una stringa.
Tuttavia, qualsiasi tipo definito dall'utente che implementa IConvertible può usare il IFormatProvider parametro .
Codifica Base64
La codifica Base64 converte i dati binari in una stringa. I dati espressi come cifre base-64 possono essere facilmente trasmessi su canali dati che possono trasmettere solo caratteri a 7 bit. La Convert classe include i metodi seguenti per supportare la codifica base64: un set di metodi supporta la conversione di una matrice di byte da e verso e da una String matrice di caratteri Unicode costituiti da caratteri in base 64 cifre.
- ToBase64String, che converte una matrice di byte in una stringa con codifica base64.
- ToBase64CharArray, che converte una matrice di byte in una matrice di caratteri con codifica base64.
- FromBase64String, che converte una stringa con codifica Base64 in una matrice di byte.
- FromBase64CharArray, che converte una matrice di caratteri con codifica Base64 in una matrice di byte.
Altre conversioni comuni
È possibile usare altre classi .NET per eseguire alcune conversioni non supportate dai metodi statici della Convert classe . tra cui:
Conversione in matrici di byte
La BitConverter classe fornisce metodi che converte i tipi numerici primitivi (inclusi Boolean) in matrici di byte e da matrici di byte a tipi di dati primitivi.
Codifica e decodifica dei caratteri
La Encoding classe e le relative classi derivate (ad esempio UnicodeEncoding e UTF8Encoding) forniscono metodi per codificare una matrice di caratteri o una stringa (ovvero per convertirle in una matrice di byte in una particolare codifica) e decodificare una matrice di byte codificata (ovvero convertire una matrice di byte in caratteri Unicode con codifica UTF16). Per altre informazioni, vedere Codifica dei caratteri in .NET.
Esempi
Nell'esempio seguente vengono illustrati alcuni dei metodi di conversione nella Convert classe , tra cui 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))