注释
本文提供了此 API 参考文档的补充说明。
静态 Convert 类包含的方法主要用于支持在 .NET 中进行与基数据类型之间的转换。 支持的基类型包括Boolean:、Char、、SByteByte、Int16Int32Int64、UInt16、、UInt32、、UInt64、、Single、、 DoubleDecimal和 DateTimeString。 此外,该 Convert 类还包括支持其他类型的转换的方法。
基本类型之间的转换
存在转换方法,用于将每个基类型转换为其他每个基类型。 但是,对特定转换方法的实际调用可能会产生五个结果之一,具体取决于运行时基类型和目标基类型的值。 这五个结果包括:
不进行转换。 当尝试将类型转换为自身时(例如,调用 Convert.ToInt32(Int32),并使用类型为 Int32 的参数),将发生这种情况。 在这种情况下,该方法只返回原始类型的实例。
InvalidCastException。 不支持特定转换时,会出现这种情况。 针对以下转换引发了 InvalidCastException:
一个 FormatException。 当尝试将字符串值转换为任何其他基类型时,如果转换失败,通常是因为字符串格式不正确。 针对以下转换引发了异常:
- 要转换为值的 Boolean 字符串不等于 Boolean.TrueString 或 Boolean.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 的基元整型类型转换为字符串,以及将字符串转换为每个基元整型类型的方法:
ToString(Byte, Int32) 和 ToByte(String, Int32),用于将字节值转换为指定进制下的字符串,以及从此字符串转换回字节值。
ToString(Int16, Int32) 和 ToInt16(String, Int32),用于在指定的进制中将 16 位带符号整数与字符串进行双向转换。
ToString(Int32, Int32) 和 ToInt32(String, Int32),用于在指定的进制中将 32 位带符号整数与字符串进行双向转换。
ToString(Int64, Int32) 和 ToInt64(String, Int32),用于在指定的进制中将 64 位带符号整数与字符串进行双向转换。
ToSByte(String, Int32),将指定格式的字节值的字符串表示形式转换为带符号字节。
ToUInt16(String, Int32),将指定格式的整数的字符串表示形式转换为无符号 16 位整数。
ToUInt32(String, Int32),将指定格式的整数的字符串表示形式转换为无符号 32 位整数。
ToUInt64(String, Int32),将指定格式的整数的字符串表示形式转换为无符号 64 位整数。
以下示例将 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 对象。
通过将值转换为数值类型的方法。 参数类型为 IFormatProvider 和 String 的重载使用了 IFormatProvider 参数。 它还由具有类型 Object 参数的重载使用; IFormatProvider 如果对象的运行时类型是一个 String。
通过将值转换为日期和时间的方法。 参数类型为 IFormatProvider 和 String 的重载使用了 IFormatProvider 参数。 它还由具有类型 Object 参数的重载使用; IFormatProvider 如果对象的运行时类型是一个 String。
通过包含 Convert.ToString 参数且可以将数值转换为字符串或将 IFormatProvider 值转换为字符串的 DateTime 重载。
但是,任何实现 IConvertible 的用户定义类型都可以使用 IFormatProvider 参数。
Base64 编码
Base64 编码将二进制数据转换为字符串。 可以通过只能传输 7 位字符的数据通道轻松传达以 base-64 数字表示的数据。 该 Convert 类包括以下支持 Base64 编码的方法:一组方法支持在字节数组与由 Base64 数字字符组成的 Unicode 字符数组之间进行转换或在字节数组和 String 之间进行转换。
- ToBase64String,用于将字节数组转换为 base64 编码的字符串。
- ToBase64CharArray,用于将字节数组转换为 base64 编码的字符数组。
- FromBase64String,用于将 base64 编码的字符串转换为字节数组。
- FromBase64CharArray,用于将 base64 编码字符数组转换为字节数组。
其他常见转换
可以使用其他 .NET 类来执行类的 Convert 静态方法不支持的某些转换。 其中包括:
转换为字节数组
该 BitConverter 类提供将基元数值类型(包括 Boolean)转换为字节数组和从字节数组转换回基元数据类型的方法。
字符编码和解码
类 Encoding 及其派生类(如 UnicodeEncoding 和 UTF8Encoding)提供对字符数组或字符串进行编码的方法(即,将其转换为特定编码中的字节数组),以及解码编码的字节数组(即将字节数组转换回 UTF16 编码的 Unicode 字符)。 有关详细信息,请参阅 .NET 中的字符编码。
示例
下面的示例演示类中的Convert一些转换方法,包括ToInt32和ToBooleanToString。
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))