ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

C# 系列教程_3 类型转换 系统精讲(新手友好,详尽版)

C# 系列教程_3 类型转换 系统精讲(新手友好,详尽版) 前置回顾C# 是强类型静态语言。变量一旦声明类型就固定。 类型转换 将一个类型的数据变成另一个类型的数据。核心总纲隐式转换编译器自动帮你转安全、不会丢数据无需写任何转换代码。显式强制转换强制转型你手动告诉编译器去转换有可能丢失数据、溢出必须写(目标类型)。Convert 工具类转换跨类型转换神器尤其适合【字符串 ↔ 基础类型】转换失败直接抛异常。TryParse 安全解析推荐生产代码使用尝试解析失败不崩溃返回 bool 标记成功与否。装箱 拆箱值类型 ↔ object 引用类型之间的特殊转换伴随内存操作。as 与 is 运算符引用类型安全转换避免强制转换抛异常。学习思路逐个学习每种转换方式 → 看懂内存机理 → 对比适用场景 → 识别坑点 → 动手敲示例。1. 隐式类型转换Implicit Conversion一句话定义由编译器自动完成不需要写任何转换代码只有保证不会丢失信息时编译器才允许隐式转换。规则小范围类型 → 大范围类型安全扩容。整数从小到大顺序方便记忆sbyte→short→int→long→float→double为什么这个顺序 把小容器的数据放进更大的容器数据完整保留不会丢失。示例 1整数隐式转换using System; namespace ImplicitDemo { class Program { static void Main(string[] args) { int numInt 100; long numLong numInt; // ✅ 隐式转换 int → long自动完成 double numDouble numInt; // ✅ int → double 隐式转换 Console.WriteLine($numInt{numInt}, numLong{numLong}, numDouble{numDouble}); } } }机理拆解numInt栈内存是 int4 字节存放 100赋值给numLonglong 8 字节编译器自动把 100 复制一份放到 8 字节空间数据完整无损long 容量比 int 大不存在溢出、丢失数据风险编译器允许自动转换。❌ 反向不允许大范围 → 小范围不能隐式转换long big 99999; int small big; //编译报错long范围大于int可能数据丢失编译器禁止隐式转换示例 2char 隐式转 intchar 底层存储 Unicode 编码数字可以隐式转为 intchar ch A; int code ch; //隐式转换 A 的Unicode码65存入code Console.WriteLine(code); //输出65但是 int不能隐式转 char因为 int 范围太大可能超出字符编码范围。示例 3隐式转换适用场景方法传参时自动隐式转换static void PrintDouble(double d) { Console.WriteLine(d); } static void Main(string[] args) { int a 10; PrintDouble(a); //int自动隐式转为double }✅ 隐式转换特点总结自动执行代码干净无损不会截断、丢失数据只能小范围→大范围编译期检查不通过直接报错。2. 显式强制转换Explicit Cast强制转型一句话程序员手动强制告诉编译器执行类型转换。你主动承担数据丢失、溢出风险。语法格式目标类型 变量名 (目标类型)源变量;适用场景大范围类型 → 小范围类型double→int 等。示例 1double 强制转为 int小数截断不是四舍五入新手大坑using System; namespace CastDemo { class Program { static void Main(string[] args) { double d1 3.99; int num1 (int)d1; //强制转换 double → int Console.WriteLine(num1); //输出3小数直接丢掉不会四舍五入 double d2 -2.99; int num2 (int)d2; Console.WriteLine(num2); //输出 -2 } } }机理强制转型(int)作用直接砍掉小数部分只保留整数部分不是数学上的四舍五入。如果想要四舍五入要用Math.Round()而不是强制转型。double d 3.99; int res (int)Math.Round(d); Console.WriteLine(res); //4示例 2long 强制转 int溢出风险long bigNum 3000000000; //超过int最大值2147483647 int smallNum (int)bigNum; Console.WriteLine(smallNum); //得到一个错误负数发生溢出机理long 8 字节数据强行塞进 4 字节 int 空间超出部分直接截断结果错乱。生产环境需要溢出检查可以使用checked关键字开启溢出检测溢出会抛异常。checked { long bigNum 3000000000; int smallNum (int)bigNum; //溢出运行时报错 }示例 3int 强制转 charint code 65; char ch (char)code; Console.WriteLine(ch); //输出 A⚠️ 强制转换的局限(int)这种强制转型不能直接把字符串转数字string str 123; int num (int)str; //编译报错string和int完全不兼容不能用这种强制转型字符串转数字要用 Convert / Parse这是新手高频错误。✅ 强制转换适用场景数字类型之间互相转换明确知道数据不会溢出。3. Convert 类转换Convert是.NET 内置工具类提供大量静态方法用于跨类型转换。核心特点可以把字符串、bool、数字互相转换转换失败直接抛出异常程序崩溃。常用方法Convert.ToInt32()→ 转为 intConvert.ToDouble()→ 转为 doubleConvert.ToDecimal()→ 转为 decimal金额Convert.ToString()→ 任意类型转为字符串Convert.ToBoolean()→ 转为 bool示例 1字符串转数字控制台程序最常用using System; namespace ConvertDemo { class Program { static void Main(string[] args) { Console.Write(请输入数字); string input Console.ReadLine(); int num Convert.ToInt32(input); Console.WriteLine(数字10 (num 10)); } } }机理Convert.ToInt32内部会解析传入字符串尝试识别数字。 ✅ 用户输入100→ 成功转为 100 ❌ 用户输入abc→抛出 FormatException 异常程序直接崩溃。示例 2数字转字符串int a 99; string s Convert.ToString(a); Console.WriteLine(s);示例 3Convert 处理小数转 int和强制转型不一样重点对比(int)直接截断小数Convert.ToInt32 会四舍五入double d 3.5; int r1 (int)d; //3直接截断 int r2 Convert.ToInt32(d); //4四舍五入 Console.WriteLine($r1{r1}, r2{r2});这是非常重要的区别很多新手踩坑。✅ Convert 适用场景快速简单转换确定输入一定合法不会出现错误格式。如果输入来源是用户不推荐直接用 Convert。4. Parse / TryParse字符串解析⭐生产代码首选Parse字符串解析成对应类型失败抛异常。TryParse安全尝试解析失败不崩溃返回 bool 表示是否成功。适用场景专门把字符串解析成基础值类型int、double、decimal 等。4.1 Parse 示例string str 123; int num int.Parse(str); Console.WriteLine(num); //int num2 int.Parse(abc); //运行报错解析失败机理int.Parse只负责解析字符串文本为整数输入非数字字符串直接异常。和 Convert.ToInt32 细微差别Parse只能接收字符串Convert 可以接收多种类型。4.2 TryParse重点写项目优先用这个语法模板bool 结果 类型.TryParse(待解析字符串, out 输出变量);返回 booltrue 解析成功false 解析失败out输出参数解析成功解析结果放入变量失败变量默认值 0。using System; namespace TryParseDemo { class Program { static void Main(string[] args) { Console.Write(请输入年龄); string input Console.ReadLine(); int age; bool parseSuccess int.TryParse(input, out age); if (parseSuccess) { Console.WriteLine($解析成功你的年龄{age}); } else { Console.WriteLine(输入格式错误不是合法数字); } } } }机理拆解用户输入文本存入字符串 inputint.TryParse尝试从头到尾解析这个字符串如果全部字符都是合法数字返回 true把解析后的数字写入 age 变量如果有字母、符号返回 falseage 赋值默认 0不会抛出异常程序不会崩溃。TryParse 是处理用户输入的最佳实践做控制台、网页、桌面程序用户输入数字一律优先 TryParse。拓展double.TryParse、decimal.TryParse、bool.TryParse 用法完全一致。5. 装箱与拆箱特殊类型转换值类型 ↔ objectobject 是 C# 所有类型的根父类。任何值类型都可以转为 object这个过程叫装箱object 转回原来的值类型叫拆箱。 本质跨越栈内存和堆内存的转换有性能开销。示例装箱 拆箱using System; namespace BoxDemo { class Program { static void Main(string[] args) { int num 10; //栈内存值类型 object obj num; //【装箱】 Console.WriteLine(obj); int num2 (int)obj; //【拆箱】强制转换取出值 Console.WriteLine(num2); } } }机理非常关键int num 10;栈开辟 4 字节保存 10object obj num;装箱在堆内存开辟一块内存把栈里的 10 复制一份放到堆栈上 obj 变量保存堆中对象的地址装箱 在堆包装值类型变成引用对象。int num2 (int)obj;拆箱强制转型检查堆内 obj 里面存放的是不是 int如果类型匹配把堆里面的值拷贝回栈 num2 变量如果类型不匹配直接抛异常。❌ 拆箱必须拆回原本类型不能乱拆int num 10; object obj num; double d (double)obj; //运行报错obj里面装的是int不能直接拆成double注意拆箱必须先拆回原类型再做其他转换。double d (double)(int)obj; //先拆箱为int再隐式转为double✅ 装箱拆箱使用场景老版本 API 接收 object 参数高频循环尽量避免装箱拆箱会带来 GC 压力。6. is 运算符 判断类型as 安全引用类型转换is判断对象是不是某个类型返回 boolas尝试把引用类型转换转换失败不会抛异常得到 null。 ⚠️ is 和 as只用于引用类型class、string不能用于值类型。示例 isobject obj Hello; if(obj is string) { Console.WriteLine(obj是字符串类型); }示例 asobject obj 测试文本; string str obj as string; if(str ! null) { Console.WriteLine(str); } //as失败时strnull不会报错对比强制转型object obj 10; string s (string)obj; //强制转换运行时报错 string s2 obj as string; //as转换失败得到null不报错7. 转换方式对比总表转换方式语法适用场景失败表现隐式转换直接赋值小范围值类型 → 大范围值类型编译报错不允许转换强制转型(目标类型)变量数字之间、装箱拆箱溢出 / 类型不匹配运行报错ConvertConvert.ToXXX()多类型互转字符串转数字失败抛异常Parse类型.Parse (str)字符串→基础类型失败抛异常TryParse类型.TryParse (str,out var)用户输入字符串解析返回 false程序不崩溃asobj as 类型引用类型安全转换失败返回 null8. 新手高频坑汇总(int)3.99直接截断小数不是四舍五入想要四舍五入用Convert.ToInt32或者Math.Round不能用(int)123把字符串转数字字符串和数字不兼容要用 Parse / Convert / TryParse拆箱必须拆回原始类型不能直接拆成别的类型隐式转换只能从小→大大→小必须强制转换只要是用户输入、外部读取的字符串一律优先 TryParse不要直接 Parse 和 Convert装箱拆箱会产生堆对象大量循环中尽量减少as不能用于值类型is可以用于值类型判断。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表