System.Convert – třída

Tento článek obsahuje doplňující poznámky k referenční dokumentaci pro toto rozhraní API.

Statická Convert třída obsahuje metody, které se primárně používají k podpoře převodu do a ze základních datových typů v .NET. Podporované základní typy jsou Boolean, , CharByteInt64Int16SByteInt32, UInt16UInt32, UInt64, , Single, , Double, , Decimala . DateTimeString Kromě toho Convert třída obsahuje metody pro podporu jiných druhů převodů.

Převody na základní typy a z základních typů

Metoda převodu existuje k převodu každého základního typu na každý druhý základní typ. Skutečné volání konkrétní metody převodu však může vytvořit jeden z pěti výsledků v závislosti na hodnotě základního typu za běhu a cílového základního typu. Mezi tyto pět výsledků patří:

  • Bez převodu. K tomu dochází při pokusu o převod z typu na sebe (například voláním Convert.ToInt32(Int32) s argumentem typu Int32). V tomto případě metoda jednoduše vrátí instanci původního typu.

  • A InvalidCastException. K tomu dochází v případě, že se konkrétní převod nepodporuje. Vyvolá se InvalidCastException pro následující převody:

  • Úloha FormatException. K tomu dochází, když pokus o převod řetězcové hodnoty na jakýkoli jiný základní typ selže, protože řetězec není ve správném formátu. Výjimka se vyvolá pro následující převody:

    • Řetězec, který se má převést na Boolean hodnotu, se nerovná Boolean.TrueString nebo Boolean.FalseString.
    • Řetězec, který se má převést na Char hodnotu, se skládá z více znaků.
    • Řetězec, který se má převést na jakýkoli číselný typ, není rozpoznán jako platné číslo.
    • Řetězec, který se má převést na hodnotu DateTime , není rozpoznán jako platná hodnota data a času.
  • Úspěšný převod. Pro převody mezi dvěma různými základními typy, které nejsou uvedeny v předchozích výsledcích, všechny rozšiřující převody a všechny zužující převody, které nemají za následek ztrátu dat, budou úspěšné a metoda vrátí hodnotu cílového základního typu.

  • A OverflowException. K tomu dochází, když zužující převod způsobí ztrátu dat. Například pokus o převod Int32 instance, jejíž hodnota je 1 0000 na Byte typ vyvolá, OverflowException protože 1 0000 je mimo rozsah datového Byte typu.

Pokud převod číselného typu způsobí ztrátu přesnosti (to znamená ztrátu některých nejméně významných číslic), vyvolá se výjimka. Pokud je však výsledek větší, než je možné reprezentovat návratovým typem hodnoty konkrétní metody převodu, vyvolá se výjimka.

Například při převodu Double na Single, může dojít ke ztrátě přesnosti, ale není vyvolána žádná výjimka. Pokud je však velikost příliš Double velké, aby byla reprezentována Single, je vyvolán výjimka přetečení.

Ne desetinná čísla

Convert Třída obsahuje statické metody, které lze volat pro převod celočíselných hodnot na řetězcové reprezentace bez desetinné čárky, a převod řetězců, které představují ne desetinná čísla na celočíselné hodnoty. Každá z těchto metod převodu base obsahuje argument, který umožňuje zadat číselný systém; binární (základ 2), osmičkové (základ 8) a šestnáctkové (základ 16) a desetinné číslo (základ 10). Existuje sada metod pro převod každého z primitivních celočíselných typů kompatibilních se specifikací CLS na řetězec a jeden pro převod řetězce na každý z primitivních integrálních typů:

Následující příklad převede hodnotu Int16.MaxValue na řetězec ve všech podporovaných číselných formátech. Potom převede řetězcovou hodnotu zpět na Int16 hodnotu.

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

Převody z vlastních objektů na základní typy

Kromě podpory převodů mezi základními typy Convert podporuje metoda převod libovolného vlastního typu na jakýkoli základní typ. K tomu musí vlastní typ implementovat IConvertible rozhraní, které definuje metody pro převod typu implementace na každý ze základních typů. Převody, které nejsou podporovány konkrétním typem by měly vyvolat .InvalidCastException

ChangeType Při předání vlastního typu jako prvního parametru nebo přiConvert.To volání metody Type (například Convert.ToInt32(Object) nebo Convert.ToDouble(Object, IFormatProvider) je volána a předána instance vlastního typu jako první parametr), Convert metoda následně volá implementaci vlastního typu IConvertible k provedení převodu. Další informace naleznete v tématu Převod typů v .NET.

Informace o formátování specifické pro jazykovou verzi

Všechny metody převodu ChangeType základního typu a metoda zahrnují přetížení, které mají parametr typu IFormatProvider. Například Convert.ToBoolean metoda má následující dvě přetížení:

Parametr IFormatProvider může poskytnout informace o formátování specifické pro jazykovou verzi, které vám pomůžou s procesem převodu. Většina metod převodu základního typu je však ignorována. Používá se pouze následujícími metodami převodu základního typu. nullIFormatProvider Pokud je argument předán těmto metodám, CultureInfo je použit objekt, který představuje aktuální jazykovou verzi.

Jakýkoli uživatelem definovaný typ, který implementuje IConvertible , však může použít IFormatProvider parametr.

Kódování Base64

Kódování Base64 převede binární data na řetězec. Data vyjádřená jako číslice base-64 lze snadno předávat přes datové kanály, které mohou přenášet pouze 7bitové znaky. Třída Convert obsahuje následující metody pro podporu kódování base64: Sada metod podporuje převod pole bajtů na a z a do String a z pole znaků Unicode, které se skládají ze základních 64 číslic.

  • ToBase64String, který převede bajtové pole na řetězec kódovaný v base64.
  • ToBase64CharArray, který převede bajtové pole na znakové pole s kódováním base64.
  • FromBase64String, který převede řetězec kódování base64 na bajtové pole.
  • FromBase64CharArray, který převede pole znaků s kódováním base64 na bajtové pole.

Další běžné převody

Jiné třídy .NET můžete použít k provedení některých převodů, které nejsou podporovány statickými metodami Convert třídy. Tady jsou některé z nich:

  • Převod na pole bajtů

    Třída BitConverter poskytuje metody, které převádějí primitivní číselné typy (včetně Boolean) na bajtová pole a z bajtových polí zpět na primitivní datové typy.

  • Kódování a dekódování znaků

    Třída Encoding a jeho odvozené třídy (například UnicodeEncoding a UTF8Encoding) poskytují metody kódování znakové matice nebo řetězce (to znamená, že je převést na bajtové pole v určitém kódování) a dekódovat zakódované bajtové pole (to znamená převést bajtové pole zpět na znaky Kódování Unicode kódování UTF16). Další informace naleznete v tématu Kódování znaků v .NET.

Příklady

Následující příklad ukazuje některé z metod převodu Convert ve třídě, včetně ToInt32, ToBooleana 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))