System.Convert 类

注释

本文提供了此 API 参考文档的补充说明。

静态 Convert 类包含的方法主要用于支持在 .NET 中进行与基数据类型之间的转换。 支持的基类型包括Boolean:、Char、、SByteByteInt16Int32Int64UInt16、、UInt32、、UInt64、、Single、、 DoubleDecimalDateTimeString。 此外,该 Convert 类还包括支持其他类型的转换的方法。

基本类型之间的转换

存在转换方法,用于将每个基类型转换为其他每个基类型。 但是,对特定转换方法的实际调用可能会产生五个结果之一,具体取决于运行时基类型和目标基类型的值。 这五个结果包括:

  • 不进行转换。 当尝试将类型转换为自身时(例如,调用 Convert.ToInt32(Int32),并使用类型为 Int32 的参数),将发生这种情况。 在这种情况下,该方法只返回原始类型的实例。

  • InvalidCastException。 不支持特定转换时,会出现这种情况。 针对以下转换引发了 InvalidCastException

  • 一个 FormatException。 当尝试将字符串值转换为任何其他基类型时,如果转换失败,通常是因为字符串格式不正确。 针对以下转换引发了异常:

    • 要转换为值的 Boolean 字符串不等于 Boolean.TrueStringBoolean.FalseString
    • 要转换为值的 Char 字符串由多个字符组成。
    • 要转换为任何数值类型的字符串无法识别为有效数字。
    • 要转换为 DateTime 的字符串无法识别为有效的日期和时间值。
  • 成功转换。 对于前面结果中未列出的两种不同的基类型之间的转换,所有扩大转换以及不会导致数据丢失的所有缩小转换都将成功,并且该方法将返回目标基类型的值。

  • OverflowException。 当缩小转换会导致数据丢失时,会出现这种情况。 例如,尝试将值为 10000 的 Int32 实例转换为 Byte 类型会引发 OverflowException 异常,因为 10000 超出了 Byte 数据类型的范围。

如果数值类型的转换导致精度损失(即丢失一些最小有效位数),则不会引发异常。 但是,如果结果大于特定转换方法的返回值类型可以表示,则会引发异常。

例如,当某个 Double 转换为 a Single时,可能会丢失精度,但不会引发异常。 但是,如果大小 Double 过大而无法由 a Single表示,则会引发溢出异常。

非十进制数

此类 Convert 包括静态方法,可以调用这些方法将整型值转换为非十进制字符串表示形式,并将表示非十进制数的字符串转换为整型值。 每个转换方法都包含一个 base 参数,用于指定数字系统;二进制(base 2)、八进制(base 8)和十六进制(base 16),以及十进制(base 10)。 有一组方法可将每个符合 CLS 的基元整型类型转换为字符串,以及将字符串转换为每个基元整型类型的方法:

以下示例将 Int16.MaxValue 的值转换为所有支持的数值格式的字符串。 然后,它将字符串值转换回一个 Int16 值。

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

从自定义对象转换为基类型

除了支持基类型之间的转换外, Convert 该方法还支持将任何自定义类型转换为任何基类型。 为此,自定义类型必须实现 IConvertible 接口,该接口定义将实现类型转换为每个基类型的方法。 特定类型不支持的转换应引发 InvalidCastException

ChangeType方法在被传递自定义类型作为其第一个参数时,或在调用Convert.ToType方法(例如Convert.ToInt32(Object)Convert.ToDouble(Object, IFormatProvider))并传递自定义类型的实例作为其第一个参数时,该Convert方法会调用自定义类型的IConvertible实现来执行转换。 有关详细信息,请参阅 .NET 中的类型转换

特定于区域性的格式设置信息

所有基类型转换方法和 ChangeType 方法都包含具有类型 IFormatProvider参数的重载。 例如,Convert.ToBoolean 方法具有以下两个重载:

IFormatProvider 参数可以提供文化特定的格式设置信息,以协助转换过程。 但是,大多数基类型转换方法都会忽略它。 它仅由以下基类型转换方法使用。 如果将 nullIFormatProvider 参数传递给这些方法,则使用表示当前区域性的 CultureInfo 对象。

但是,任何实现 IConvertible 的用户定义类型都可以使用 IFormatProvider 参数。

Base64 编码

Base64 编码将二进制数据转换为字符串。 可以通过只能传输 7 位字符的数据通道轻松传达以 base-64 数字表示的数据。 该 Convert 类包括以下支持 Base64 编码的方法:一组方法支持在字节数组与由 Base64 数字字符组成的 Unicode 字符数组之间进行转换或在字节数组和 String 之间进行转换。

其他常见转换

可以使用其他 .NET 类来执行类的 Convert 静态方法不支持的某些转换。 其中包括:

  • 转换为字节数组

    BitConverter 类提供将基元数值类型(包括 Boolean)转换为字节数组和从字节数组转换回基元数据类型的方法。

  • 字符编码和解码

    Encoding 及其派生类(如 UnicodeEncodingUTF8Encoding)提供对字符数组或字符串进行编码的方法(即,将其转换为特定编码中的字节数组),以及解码编码的字节数组(即将字节数组转换回 UTF16 编码的 Unicode 字符)。 有关详细信息,请参阅 .NET 中的字符编码。

示例

下面的示例演示类中的Convert一些转换方法,包括ToInt32ToBooleanToString

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