C# 类型转换

6 阅读3分钟

一、暴力转换,强转

这是最原始、最高效,但也是最危险的方式。

  • 原理:告诉编译”别管这么多,我确定它就是这个类型,你给我转换就行!“

  • 适用场景:

    • 数值类型之间的转换(如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严格,对格式严格
parsestring->值类型必须确保格式正确
tryparse返回false返回falsestring->值类型最安全无异常,需配合out