一、暴力转换,强转
这是最原始、最高效,但也是最危险的方式。
-
原理:告诉编译”别管这么多,我确定它就是这个类型,你给我转换就行!“
-
适用场景:
- 数值类型之间的转换(如double转int,会丢失精度)。
- object 拆箱、
-
缺点:如果类型不兼容(比如把”hello“强转为int),程序直接崩溃(抛出InvalidCastException)。
// 1:丢弃小数
double pi = 3.14159;
int i = (int)pi; // i = 3
// 2:拆箱
object obj = 100;
int num = (int)obj; // 成功
// 错误示范
object str = "hello";
// int crash = (int)str; // 程序崩溃!
二、as 运算符
专门为引用类型(对象、字符串、类)设计的安全机制。
-
原理:尝试把对象视为某种类型。
-
结果:
- 成功->返回转换后的对象
- 失败->返回null(绝不报错)。
-
适用场景:处理多态,继承关系,或者不确定对象具体的子类时。
object obj = "我是字符串";
string s = obj as string;
if (s != null)
{
Console.WriteLine("转换成功");
}
else
{
Console.WriteLine("类型不匹配,但没报错");
}
// 注意:不能用int,double 等非空类型,如果你想尝试看报不报错的话
// int i = obj as int; 编译错误
// int? i = obj as int?; 可空类型
三、Convert类
System.Convert 是一个专门的工具类,它的逻辑是内容加工。
- 原理:它不仅仅是类型转换,更是数据意义的转换。它可以处理null,也可以把字符串'123'变成数字123.
- 最大特点:处理null时不报错,而是返回默认值(比如0)。
- 适用场景:通用转换,或者不确定输入是否为null时。
string strNum = "123";
int a = Convert.ToInt32(strNum); // 结果 123
string empty = null;
int b = Convert.ToInt32(empty);
// 结果是 0 这是 Convert 特有的行为,不会崩。
// 依然会崩的情况:格式不对
// int c = Convert.ToInt32("abc");
四、Parse与TryParse
这是专门针对 字符串(string) -> 值类型(int、Date、Time、bool)的转换机制。
1.Parse(严格模式)
- 特点:非常头铁。只要格式不对,或者字符串时null,直接崩溃。
- 电平:拉完了,除非你百分百确定字符串格式正确(比如从数据库取出的经过校验的数据),否则尽量少用。
string s1 = "123";
int n1 = int.Parse(s1); // 123
string s2 = null;
// int n2 = int.Parse(s2); // ArgumentNullException (Convert这里会返回0,Parse会崩)
string s3 = "abc";
// int n3 = int.Parse(s3); // FormatException
2.TryParse(推荐)
- 特点:夯爆了,结合了 out 参数,是最安全,最专业的字符串转换方式。
- 原理:它返回一个bool(成功、失败),转换后的结果通过out参数丢出来。
- 使用场景:用户输入、读取文件、API返回的数据等不可信来源。
string input = "123.45"; // 或者 "abc"
double result;
bool isSuccess = double.TryParse(input, out result);
if (isSuccess)
{
Console.WriteLine($"转换成功,数字是:{result}");
}
else
{
Console.WriteLine("输入的不是有效数字!");
}
总结
| 方法 | 处理null | 处理格式错误(“abc”转int) | 适用范围 | 核心特点 |
|---|---|---|---|---|
| 强转 | 崩 | 崩 | 数值截断/拆箱 | 最快,很暴力 |
| as | 返回null | 返回null | 仅引用类型 | 安全、失败不报错 |
| convert | 返回 0 | 崩 | 通用 | 对null严格,对格式严格 |
| parse | 崩 | 崩 | string->值类型 | 必须确保格式正确 |
| tryparse | 返回false | 返回false | string->值类型 | 最安全无异常,需配合out |