在C#中,类型转换是将一个数据类型的值转换为另一个数据类型的过程。
C#中的类型转换可以分为两种:隐式类型转换和显式类型转换(也称为强制类型转换)。
隐式类型转换
隐式转换是不需要编写代码来指定的转换,编译器会自动进行。
隐式转换是将一个较小范围的数据类型转换为较大范围的数据类型时,编译器会自动完成类型转换,这些转换是C#默认的以安全方式进行的转换,不会导致数据丢失。
例如,从int到long,从float到double等。
从小的整数类型转换为大的整数类型,从派生类转换为基类。将一个byte类型的变量赋值给int类型的变量,编译器会自动将byte类型转换为int类型,不需要显示转换。
byte b = 10;
int i = b; // 隐式转换,不需要显式转换int intValue = 42;
long longValue = intValue; // 隐式转换,从 int 到 long
显式转换
显示类型转换,即强制类型转换,需要在代码明确指定。
显式转换是将一个较大范围的数据类型转换为较小范围的数据类型时,或者将一个对象类型转换为另一个对象类型时,需要使用强制类型符号进行显示转换,强制转换会造成数据丢失。
int i = 10;
byte b = (byte)i; // 显式转换,需要使用强制类型转换符号double doubleValue = 3.14;
int intValue = (int)doubleValue; // 强制从 double 到 int,数据可能损失小数部分int intValue = 42;
float floatValue = (float)intValue; // 强制从 int 到 float,数据可能损失精度int intValue = 123;
string stringValue = intValue.ToString(); // 将 int 转换为字符串using System;namespace TypeConversionApplication
{class ExplicitConversion{static void Main(string[] args){double d = 5673.74;int i;// 强制转换 double 为 inti = (int)d;Console.WriteLine(i);Console.ReadKey();}}
}
C#类型转换方法
C# 提供了下列内置的类型转换方法:
序号 | 方法 & 描述 |
---|---|
1 | ToBoolean 如果可能的话,把类型转换为布尔型。 |
2 | ToByte 把类型转换为字节类型。 |
3 | ToChar 如果可能的话,把类型转换为单个 Unicode 字符类型。 |
4 | ToDateTime 把类型(整数或字符串类型)转换为 日期-时间 结构。 |
5 | ToDecimal 把浮点型或整数类型转换为十进制类型。 |
6 | ToDouble 把类型转换为双精度浮点型。 |
7 | ToInt16 把类型转换为 16 位整数类型。 |
8 | ToInt32 把类型转换为 32 位整数类型。 |
9 | ToInt64 把类型转换为 64 位整数类型。 |
10 | ToSbyte 把类型转换为有符号字节类型。 |
11 | ToSingle 把类型转换为小浮点数类型。 |
12 | ToString 把类型转换为字符串类型。 |
13 | ToType 把类型转换为指定类型。 |
14 | ToUInt16 把类型转换为 16 位无符号整数类型。 |
15 | ToUInt32 把类型转换为 32 位无符号整数类型。 |
16 | ToUInt64 把类型转换为 64 位无符号整数类型。 |
这些方法都定义在 System.Convert 类中,使用时需要包含 System 命名空间。它们提供了一种安全的方式来执行类型转换,因为它们可以处理 null值,并且会抛出异常,如果转换不可能进行。
例如,使用 Convert.ToInt32 方法将字符串转换为整数:
string str = "123";
int number = Convert.ToInt32(str); // 转换成功,number为123
如果字符串不是有效的整数表示,Convert.ToInt32 将抛出 FormatException。
下面的实例把不同值的类型转换为字符串类型:
using System;namespace TypeConversionApplication
{class StringConversion{static void Main(string[] args){// 定义一个整型变量int i = 75;// 定义一个浮点型变量float f = 53.005f;// 定义一个双精度浮点型变量double d = 2345.7652;// 定义一个布尔型变量bool b = true;// 将整型变量转换为字符串并输出Console.WriteLine(i.ToString());// 将浮点型变量转换为字符串并输出Console.WriteLine(f.ToString());// 将双精度浮点型变量转换为字符串并输出Console.WriteLine(d.ToString());// 将布尔型变量转换为字符串并输出Console.WriteLine(b.ToString());// 等待用户按键后关闭控制台窗口Console.ReadKey();}}
}
在进行类型转换时需要注意以下几点:
隐式转换只能将较小范围的数据类型转换为较大范围的数据类型,不能将较大范围的数据类型转换为较小范围的数据类型;
显式转换可能会导致数据丢失或精度降低,需要进行数据类型的兼容性检查;
对于对象类型的转换,需要进行类型转换的兼容性检查和类型转换的安全性检查。
类型转换方法
C# 提供了多种类型转换方法,例如使用 Convert 类、Parse 方法和 TryParse 方法,这些方法可以帮助处理不同的数据类型之间的转换。
使用 Convert 类
Convert 类提供了一组静态方法,可以在各种基本数据类型之间进行转换。
string str = "123";
int num = Convert.ToInt32(str);
使用 Parse 方法
Parse 方法用于将字符串转换为对应的数值类型,如果转换失败会抛出异常。
string str = "123.45";
double d = double.Parse(str);
使用 TryParse 方法
TryParse 方法类似于 Parse,但它不会抛出异常,而是返回一个布尔值指示转换是否成功。
string str = "123.45";
double d;
bool success = double.TryParse(str, out d);if (success) {Console.WriteLine("转换成功: " + d);
} else {Console.WriteLine("转换失败");
}
在 C# 中,内置的类型转换方法主要通过以下几种方式实现:隐式转换、显式转换(强制转换)、使用 Convert 类的方法、Parse 方法和 TryParse 方法,这些方法广泛应用于不同数据类型之间的转换。
以下是 C# 内置类型转换方法的表格:
方法类别 | 方法 | 描述 |
---|---|---|
隐式转换 | 自动进行的转换 | 无需显式指定,通常用于安全的类型转换,如从较小类型到较大类型 |
显式转换(强制转换) | (type)value | 需要显式指定,通常用于可能导致数据丢失或转换失败的情况 |
Convert 类方法 | Convert.ToBoolean(value) | 将指定类型转换为 Boolean |
Convert.ToByte(value) | 将指定类型转换为 Byte | |
Convert.ToChar(value) | 将指定类型转换为 Char | |
Convert.ToDateTime(value) | 将指定类型转换为 DateTime | |
Convert.ToDecimal(value) | 将指定类型转换为 Decimal | |
Convert.ToDouble(value) | 将指定类型转换为 Double | |
Convert.ToInt16(value) | 将指定类型转换为 Int16 (短整型) | |
Convert.ToInt32(value) | 将指定类型转换为 Int32 (整型) | |
Convert.ToInt64(value) | 将指定类型转换为 Int64 (长整型) | |
Convert.ToSByte(value) | 将指定类型转换为 SByte | |
Convert.ToSingle(value) | 将指定类型转换为 Single (单精度浮点型) | |
Convert.ToString(value) | 将指定类型转换为 String | |
Convert.ToUInt16(value) | 将指定类型转换为 UInt16 (无符号短整型) | |
Convert.ToUInt32(value) | 将指定类型转换为 UInt32 (无符号整型) | |
Convert.ToUInt64(value) | 将指定类型转换为 UInt64 (无符号长整型) | |
Parse 方法 | Boolean.Parse(string) | 将字符串解析为 Boolean |
Byte.Parse(string) | 将字符串解析为 Byte | |
Char.Parse(string) | 将字符串解析为 Char | |
DateTime.Parse(string) | 将字符串解析为 DateTime | |
Decimal.Parse(string) | 将字符串解析为 Decimal | |
Double.Parse(string) | 将字符串解析为 Double | |
Int16.Parse(string) | 将字符串解析为 Int16 | |
Int32.Parse(string) | 将字符串解析为 Int32 | |
Int64.Parse(string) | 将字符串解析为 Int64 | |
SByte.Parse(string) | 将字符串解析为 SByte | |
Single.Parse(string) | 将字符串解析为 Single | |
UInt16.Parse(string) | 将字符串解析为 UInt16 | |
UInt32.Parse(string) | 将字符串解析为 UInt32 | |
UInt64.Parse(string) | 将字符串解析为 UInt64 | |
TryParse 方法 | Boolean.TryParse(string, out bool) | 尝试将字符串解析为 Boolean ,返回布尔值表示是否成功 |
Byte.TryParse(string, out byte) | 尝试将字符串解析为 Byte ,返回布尔值表示是否成功 | |
Char.TryParse(string, out char) | 尝试将字符串解析为 Char ,返回布尔值表示是否成功 | |
DateTime.TryParse(string, out DateTime) | 尝试将字符串解析为 DateTime ,返回布尔值表示是否成功 | |
Decimal.TryParse(string, out decimal) | 尝试将字符串解析为 Decimal ,返回布尔值表示是否成功 | |
Double.TryParse(string, out double) | 尝试将字符串解析为 Double ,返回布尔值表示是否成功 | |
Int16.TryParse(string, out short) | 尝试将字符串解析为 Int16 ,返回布尔值表示是否成功 | |
Int32.TryParse(string, out int) | 尝试将字符串解析为 Int32 ,返回布尔值表示是否成功 | |
Int64.TryParse(string, out long) | 尝试将字符串解析为 Int64 ,返回布尔值表示是否成功 | |
SByte.TryParse(string, out sbyte) | 尝试将字符串解析为 SByte ,返回布尔值表示是否成功 | |
Single.TryParse(string, out float) | 尝试将字符串解析为 Single ,返回布尔值表示是否成功 | |
UInt16.TryParse(string, out ushort) | 尝试将字符串解析为 UInt16 ,返回布尔值表示是否成功 | |
UInt32.TryParse(string, out uint) | 尝试将字符串解析为 UInt32 ,返回布尔值表示是否成功 | |
UInt64.TryParse(string, out ulong) | 尝试将字符串解析为 UInt64 ,返回布尔值表示是否成功 |