System.Convert osztály

Megjegyzés:

Ez a cikk kiegészítő megjegyzéseket tartalmaz az API referenciadokumentációjához.

A statikus Convert osztály olyan metódusokat tartalmaz, amelyek elsősorban a .NET-ben lévő alapadattípusokra való konvertálás támogatására szolgálnak. A támogatott alaptípusok a következőkBoolean: , Char, SByte, Byte, Int16, Int32Int64UInt16UInt32, UInt64, , Single, , DoubleDecimalDateTime , és .String Az osztály emellett Convert más típusú átalakítások támogatására is használható módszereket tartalmaz.

Átalakítás alaptípusokra és alaptípusokból

Létezik konverziós módszer, amely minden alaptípust minden más alaptípusra konvertál. Egy adott konverziós módszer tényleges hívása azonban az öt eredmény egyikét eredményezheti a futásidőben az alaptípus és a cél alaptípus értékétől függően. Ez az öt eredmény a következő:

  • Nincs átalakítás. Ez akkor fordul elő, ha egy típust próbálnak önmagába konvertálni (például a Convert.ToInt32(Int32) hívása során egy Int32 típusú argumentummal). Ebben az esetben a metódus egyszerűen az eredeti típus egy példányát adja vissza.

  • Egy InvalidCastException. Ez akkor fordul elő, ha egy adott átalakítás nem támogatott. A InvalidCastException hibát jelez a következő konverziók esetén:

  • Egy FormatException. Ez akkor fordul elő, ha a sztringérték más alaptípusra való konvertálásának kísérlete meghiúsul, mert a sztring nem a megfelelő formátumban van. A rendszer kivételt ad ki a következő konverziók esetében:

    • A sztring, amelyet értékké kell konvertálni, nem egyenlő a Boolean vagy Boolean.TrueString értékkel.
    • A Char értékké konvertálandó sztring több karakterből áll.
    • A numerikus típussá konvertálandó sztringek nem ismerhetők fel érvényes számként.
    • A konvertálni kívánt sztring DateTime nem ismerhető fel érvényes dátum- és időértékként.
  • Sikeres átalakítás. Az előző eredményekben nem szereplő két különböző alaptípus közötti konverziók esetén az összes szélesítő konverzió, valamint az összes olyan szűkítő konverzió sikeres lesz, amely nem eredményez adatvesztést, és a metódus a célzott alaptípus értékét adja vissza.

  • Egy OverflowException. Ez akkor fordul elő, ha a szűkülő átalakítás adatvesztést eredményez. Például, ha megpróbál átalakítani egy Int32 típusú, 10000-es értékű példányt Byte típussá, az OverflowException kivételt dob, mivel a 10000 kívül esik a Byte adattípus tartományán.

A program nem tesz kivételt, ha egy numerikus típus konvertálása pontosságvesztést eredményez (azaz néhány legkevésbé jelentős számjegy elvesztését). Kivételt jelent azonban, ha az eredmény nagyobb, mint amit az adott konverziós módszer visszatérési értéktípusa képvisel.

Ha például egy DoubleSingle-ba alakul, pontosságvesztés fordulhat elő, de nem keletkezik kivétel. Ha azonban a Double nagysága túl nagy ahhoz, hogy egy Single ábrázolja, túlcsordulási kivétel keletkezik.

Nem decimális számok

Az Convert osztály olyan statikus metódusokat tartalmaz, amelyekkel az integrálértékeket nem decimális sztring-ábrázolásokká alakíthatja át, és a nem decimális számokat ábrázoló sztringeket integrálértékekké alakíthatja. Mindegyik átalakítási módszer tartalmaz egy base argumentumot, amely lehetővé teszi a számrendszer megadását; bináris (2. alap), oktális (8. alap) és hexadecimális (16. alap), valamint decimális (10. alap). Van egy olyan módszerkészlet, amely lehetővé teszi a CLS-kompatibilis primitív integráltípusok mindegyikének sztringgé alakítását, valamint egy olyan, amely a sztringeket visszaalakítja az egyes primitív integráltípusokká.

Az alábbi példa a Int16.MaxValue értékét sztringgé alakítja minden támogatott számformátum esetében. Ezután a sztring értékét visszaalakítja egy Int16 értékké.

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($"{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
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

Átalakítás egyéni objektumokról alaptípusokra

Az alaptípusok közötti átalakítás támogatása mellett a Convert módszer támogatja az egyéni típusok bármilyen alaptípusra való konvertálását. Ehhez az egyéni típusnak implementálnia kell az IConvertible interfészt, amely metódusokat határoz meg a implementálási típus minden alaptípusra való konvertálásához. Az adott típus által nem támogatott konverzióknak egy InvalidCastException kivételt kell dobniuk.

Ha a ChangeType metódus első paramétereként egy egyéni típust ad át, vagy amikor aConvert.To Típus metódus (például Convert.ToInt32(Object) meghívja vagy Convert.ToDouble(Object, IFormatProvider) átadja az egyéni típus egy példányát első paraméterként), a Convert metódus meghívja az egyéni típus implementációját IConvertible az átalakítás végrehajtásához. További információ: Típuskonvertálás a .NET-ben.

Kultúraspecifikus formázási információk

Az összes alaptípus-konverziós módszer és a ChangeType metódus olyan túlterheléseket tartalmaz, amelyek típusparaméterrel IFormatProviderrendelkeznek. A metódus például Convert.ToBoolean a következő két túlterhelést tartalmazza:

A IFormatProvider paraméter a kultúraspecifikus formázási információkat is megadhatja, hogy segítse a konvertálási folyamatot. Ezt azonban a legtöbb alaptípus-konverziós módszer figyelmen kívül hagyja. Csak a következő alaptípus-átalakítási módszerek használják. Ha argumentumot nullIFormatProvider ad át ezeknek a metódusoknak, a rendszer az CultureInfo aktuális kultúrát képviselő objektumot használja.

  • Olyan metódusok szerint, amelyek numerikus típussá alakítják az értéket. Az IFormatProvider paramétert az a túlterhelés használja, amelynek paraméterei String és IFormatProvider típusúak. A túlterhelés akkor is használható, ha rendelkezik Object és IFormatProvider típusparaméterekkel, ha az objektum futásidejű típusa String.

  • Az értékeket dátummá és idővé konvertáló metódusok szerint. Az IFormatProvider paramétert az a túlterhelés használja, amelynek paraméterei String és IFormatProvider típusúak. A túlterhelés akkor is használható, ha rendelkezik Object és IFormatProvider típusparaméterekkel, ha az objektum futásidejű típusa String.

  • A Convert.ToString paramétert IFormatProvider tartalmazó túlterhelések, amelyek numerikus értéket sztringgé vagy DateTime értékké alakítanak át.

Bármely felhasználó által definiált típus, amely implementálja a IConvertible, használhatja a IFormatProvider paramétert.

Base64-kódolás

A Base64 kódolás a bináris adatokat sztringgé alakítja. Az alap-64 számjegyként kifejezett adatok könnyen továbbíthatók olyan adatcsatornákon keresztül, amelyek csak 7 bites karaktereket képesek továbbítani. Az Convert osztály a következő metódusokat tartalmazza a base64 kódolás támogatásához: A metódusok készlete támogatja a bájtok tömbjének konvertálását egy 64 számjegyből álló Unicode-karakterekből álló tömbbe, illetve azokból String vagy azok közé.

  • ToBase64String, amely egy bájttömböt base64 kódolású sztringgé alakít át.
  • ToBase64CharArray, amely egy bájttömböt base64 kódolású karaktertömbté alakít át.
  • FromBase64String, amely egy base64 kódolású sztringet bájttömbté konvertál.
  • FromBase64CharArray, amely egy base64 kódolású karaktertömböt bájttömbté alakít át.

Egyéb gyakori átalakítások

Más .NET-osztályokkal olyan átalakításokat hajthat végre, amelyeket az osztály statikus metódusai nem támogatnak Convert . Ezek közé tartoznak:

  • Konvertálás bájttömbökké

    Az BitConverter osztály olyan metódusokat biztosít, amelyek a primitív numerikus típusokat (beleértve Boolean) bájttömbökké, a bájttömbökből pedig a primitív adattípusokká alakítják át.

  • Karakterkódolás és dekódolás

    Az Encoding osztály és annak származtatott osztályai (például UnicodeEncoding és UTF8Encoding) metódusokat biztosítanak egy karaktertömb vagy egy sztring kódolásához (azaz egy adott kódolásban lévő bájttömbké alakításához), valamint egy kódolt bájttömb dekódolásához (azaz egy bájttömb UTF16 kódolású Unicode-karakterekké alakításához). További információ: Karakterkódolás a .NET-ben.

Példák

Az alábbi példa bemutatja az Convert osztály néhány konverziós módszerét, beleértve a ToInt32, ToBoolean és 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 {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))