C#类型转换 显隐转换

C# 类型转换核心概念总结

🔄 一、两大转换类型(核心区分)

1. 隐式转换(Implicit Conversion)

编译器自动完成,无需代码干预,保证数据安全

csharp

复制代码
// 值类型:小转大(安全)
int a = 100;
double b = a;  // ✅ 自动转换,无数据丢失

// 引用类型:子类转父类(安全)
父类 obj = new 子类();  // ✅ 子类对象可以赋值给父类变量

规则

  • 值类型:小范围 → 大范围(int→long, float→double)

  • 引用类型:子类 → 父类

  • 绝对安全:不会丢失数据或信息


2. 显式转换(Explicit Conversion)

程序员手动写代码,可能数据丢失,需要谨慎

csharp

复制代码
// 值类型:大转小(危险)
double d = 123.456;
int i = (int)d;  // 需要显式转换,丢失小数部分

// 引用类型:父类转子类(危险)
父类 obj = new 子类();
子类 child = (子类)obj;  // 需要显式转换

特点

  • 需要强制类型转换符(目标类型)

  • 可能数据丢失运行时异常

  • 程序员必须明确知道转换是安全的


⚠️ 二、引用类型转换的特殊性

继承关系是转换的基础

csharp

复制代码
public class 父类 { }
public class 子类 : 父类 { }  // 子类继承父类

// ✅ 隐式:子→父(总是安全)
父类 parent = new 子类();

// ⚠️ 显式:父→子(可能失败)
子类 child = (子类)parent;  // 仅当parent实际是子类对象时才安全

🛡️ 三、安全转换技术

1. as 运算符(最安全)

csharp

复制代码
父类 obj = new 父类();
子类 result = obj as 子类;  // 尝试转换

if (result != null)  // 转换成功
{
    // 安全使用
}
// 失败时返回 null,不会抛出异常

特点

  • 失败返回 null不会抛异常

  • 只能用于引用类型

  • 推荐用于引用类型转换


2. is 运算符 + 模式匹配

csharp

复制代码
// 传统方式
if (obj is 子类)
{
    子类 child = (子类)obj;  // 需要两次操作
}

// 模式匹配(C# 7.0+)
if (obj is 子类 child)  // 判断并转换一步完成
{
    // 可以直接使用 child
}

特点

  • 返回 bool不会抛异常

  • 可用于所有类型(值类型+引用类型)

  • 模式匹配语法更简洁


📊 四、as vs is 对比表

特性 as 运算符 is 运算符
返回值 成功:目标类型对象 失败:null 成功:true 失败:false
异常 永远不会抛出异常 永远不会抛出异常
适用类型 仅引用类型 所有类型
代码简洁度 需要额外判空 模式匹配时简洁
性能 较快 稍慢(需类型检查)

🔧 五、其他转换方式

Parse 方法(字符串→其他类型)

csharp

复制代码
// 字符串转数值
int num = int.Parse("123");     // 失败抛异常
bool success = int.TryParse("abc", out int result);  // 安全版本

// 使用场景:用户输入、配置文件读取

Convert 类(万能转换)

csharp

复制代码
// 更强大的转换功能
double d = Convert.ToDouble("123.45");
int i = Convert.ToInt32(123.456);  // 四舍五入

// 特点:处理 null、支持更多类型转换

自定义转换(操作符重载)

csharp

复制代码
public class MyClass
{
    public int Value { get; set; }
    
    // 隐式转换操作符
    public static implicit operator int(MyClass obj)
        => obj.Value;
    
    // 显式转换操作符
    public static explicit operator MyClass(int value)
        => new MyClass { Value = value };
}

🎯 六、选择指南(实战决策)

什么情况用什么?

场景 推荐方案 原因
字符串转数值 TryParse() 安全,避免异常
引用类型向下转换 as 运算符 安全,代码简洁
类型检查+转换 is 模式匹配 一步完成
数值大转小 显式转换 (int) 明确表达意图
复杂类型转换 Convert 功能全面

💡 七、重要原则(必须记住)

黄金法则:

  1. 隐式转换:编译器帮你,绝对安全

  2. 显式转换:你告诉编译器"我知道风险"

  3. as/is:安全第一,避免崩溃

安全优先级:

text

复制代码
TryParse() > as/is > 显式转换 > Parse()

常见陷阱:

csharp

复制代码
// ❌ 危险:可能抛出 InvalidCastException
子类 obj = (子类)某个父类对象;

// ✅ 安全:使用 as 或 is
子类 obj = 某个父类对象 as 子类;
if (obj != null) { /* 安全使用 */ }

📝 八、一句话记忆

  • 隐式转换:自动的、安全的(小→大,子→父)

  • 显式转换:手动的、有风险的(大→小,父→子)

  • as 转换:安全的引用类型转换(失败返回null)

  • is 检查:安全的类型检查(可结合转换)


🚨 九、警告清单

绝对不要这样做

  1. 不检查就直接显式转换父类为子类

  2. 使用 Parse() 而不考虑异常

  3. 忽略 as 转换的 null 检查

  4. 在有符号和无符号类型间随意转换

应该这样做

  1. 优先使用 asis

  2. 字符串转数值用 TryParse()

  3. 不确定时先检查再转换

  4. 明确转换可能的数据丢失

相关推荐
唯情于酒1 小时前
net core web api 使用log4net
c#·.net core
SunnyDays10111 小时前
C# 实战:快速查找并高亮 Word 文档中的文字(普通查找 + 正则表达式)
开发语言·c#
人工智能AI技术1 小时前
Qwen3.5-Plus登顶|C#集成通义千问,高并发服务实战优化
人工智能·c#
SunnyDays10113 小时前
如何使用 C# 在 Word 文档中插入超链接 (含文本与图片链接)
开发语言·c#
一念春风3 小时前
证件照制作工具(WPF C#)
c#·wpf
似水明俊德11 小时前
02-C#.Net-反射-面试题
开发语言·面试·职场和发展·c#·.net
阿蒙Amon13 小时前
C#常用类库-详解SerialPort
开发语言·c#
似水明俊德14 小时前
02-C#.Net-反射-学习笔记
开发语言·笔记·学习·c#·.net
.NET修仙日记19 小时前
Acme.ReturnOh:让.NET API返回值处理更优雅,统一响应格式一步到位
c#·.net·webapi
阿蒙Amon21 小时前
C#常用类库-详解YamlDotNet
开发语言·c#