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 . DateTimeStringSByteCharBoolean 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:

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.Tometodo 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 nullIFormatProvider argomento, viene utilizzato l'oggetto CultureInfo che rappresenta le impostazioni cultura correnti.

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