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 . DateTime String 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ů:
ToString(Byte, Int32) a ToByte(String, Int32), chcete-li převést bajtovou hodnotu na řetězec v zadaném základu a z řetězce.
ToString(Int16, Int32) a ToInt16(String, Int32), pro převod 16bitové signed integer na a z řetězce v zadaném základu.
ToString(Int32, Int32) a ToInt32(String, Int32), chcete-li převést 32bitové signed integer na řetězec v zadaném základu a z řetězce.
ToString(Int64, Int32) a ToInt64(String, Int32), chcete-li převést 64bitové signed integer na řetězec v zadaném základu a z řetězce.
ToSByte(String, Int32), chcete-li převést řetězcovou reprezentaci bajtové hodnoty v zadaném formátu na podepsaný bajt.
ToUInt16(String, Int32), pro převod řetězcové reprezentace celého čísla v zadaném formátu na 16bitové celé číslo bez znaménka.
ToUInt32(String, Int32), chcete-li převést řetězcové vyjádření celého čísla v zadaném formátu na celé číslo bez znaménka 32bitové.
ToUInt64(String, Int32), chcete-li převést řetězcové vyjádření celého čísla v zadaném formátu na celé číslo bez znaménka 64bitové.
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. null
IFormatProvider Pokud je argument předán těmto metodám, CultureInfo je použit objekt, který představuje aktuální jazykovou verzi.
Pomocí metod, které převedou hodnotu na číselný typ. Parametr IFormatProvider se používá přetížením, které má parametry typu String a IFormatProvider. Používá se také přetížení, které má parametry typu Object a IFormatProvider pokud je typ běhu objektu .String
Pomocí metod, které převedou hodnotu na datum a čas. Parametr IFormatProvider se používá přetížením, které má parametry typu String a IFormatProvider. Používá se také přetížení, které má parametry typu Object a IFormatProvider pokud je typ běhu objektu .String
Convert.ToString Přetíženími, které obsahují IFormatProvider parametr a které převedou číselnou hodnotu na řetězec nebo DateTime hodnotu na řetězec.
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))