掌握 C# 类型转换:隐式、显式、Parse 与 Convert 全方位指南
C# 类型转换完全指南
全面掌握 C# 类型转换核心技术:从隐式/显式转换到 Parse/Convert API,附最佳实践与避坑指南,写出类型安全且高效的代码。
类型转换——将值从一种数据类型转换为另一种——是 C# 开发的核心技能。理解何时、如何使用各种转换方式,能让你的代码兼具安全性与表达力。
C# 转换主要分两大类:
- 隐式类型转换
- 显式类型转换(强制转换)
1. 隐式类型转换
当转换绝无数据丢失风险时,编译器自动完成,无需任何语法标记。典型场景:小范围数值类型向大范围类型转换(如 int → double)。
示例:隐式转换
using System;
namespace MyApplication {
class Program {
static void Main(string[] args) {
int numInt = 500;
// 隐式转换:int → double
double numDouble = numInt;
Console.WriteLine($"numInt 值: {numInt}");
Console.WriteLine($"numInt 类型: {numInt.GetType()}");
Console.WriteLine($"numDouble 值: {numDouble}");
Console.WriteLine($"numDouble 类型: {numDouble.GetType()}");
Console.ReadLine();
}
}
}
输出
numInt 值: 500 numInt 类型: System.Int32 numDouble 值: 500 numDouble 类型: System.Double
double 容量大于 int,编译器安全提升类型,零风险。
2. 显式类型转换(强制转型)
当转换可能丢失数据(大范围→小范围)或类型间无隐式转换关系时,必须显式指明意图。编译器会在潜在数据丢失时发出警告。
示例:显式转换
using System;
namespace MyApplication {
class Program {
static void Main(string[] args) {
double numDouble = 1.23;
// 显式强制转换:double → int
int numInt = (int)numDouble;
Console.WriteLine($"原始 double 值: {numDouble}");
Console.WriteLine($"转换后 int 值: {numInt}");
Console.ReadLine();
}
}
}
输出
原始 double 值: 1.23 转换后 int 值: 1
小数部分被截断(向零取整)。若需四舍五入,请在转换前使用 Math.Round 等方法。
3. 字符串转数值:Parse() 方法
将 string 转为数值类型时,int.Parse、double.Parse 等提供直观、类型安全的方式。
示例:int.Parse
using System;
namespace Conversion {
class Program {
static void Main(string[] args) {
string n = "100";
int a = int.Parse(n);
Console.WriteLine($"原始字符串: {n}");
Console.WriteLine($"转换后 int: {a}");
Console.ReadLine();
}
}
}
输出
原始字符串: 100 转换后 int: 100
"test")会抛出 FormatException。生产代码必须用 try-catch 或 int.TryParse 处理异常。4. Convert 类:通用转换利器
System.Convert 静态类提供广泛的类型间转换方法,内部常包含空值检查、溢出检测等安全逻辑。
| 方法 | 说明 |
|---|---|
ToBoolean() | 转为 bool |
ToChar() | 转为 char |
ToDouble() | 转为 double |
ToInt16() | 转为 16 位 int |
ToInt32() | 转为 32 位 int(常用) |
ToInt64() | 转为 64 位 long |
ToString() | 转为 string(任意类型通用) |
ToDateTime() | 转为 DateTime |
示例:int ↔ string、double
using System;
namespace Conversion {
class Program {
static void Main(string[] args) {
int num = 100;
Console.WriteLine($"int 值: {num}");
string str = Convert.ToString(num);
Console.WriteLine($"string 值: {str}");
double dbl = Convert.ToDouble(num);
Console.WriteLine($"double 值: {dbl}");
Console.ReadLine();
}
}
}
输出
int 值: 100 string 值: 100 double 值: 100
示例:string ↔ double
using System;
namespace Conversion {
class Program {
static void Main(string[] args) {
string str = "99.99";
Console.WriteLine($"原始字符串: {str}");
double dbl = Convert.ToDouble(str);
Console.WriteLine($"转换后 double: {dbl}");
double num = 88.9;
Console.WriteLine($"原始 double: {num}");
string newStr = Convert.ToString(num);
Console.WriteLine($"转换后字符串: {newStr}");
Console.ReadLine();
}
}
}
输出
原始字符串: 99.99 转换后 double: 99.99 原始 double: 88.9 转换后字符串: 88.9
示例:int → bool
using System;
namespace Conversion {
class Program {
static void Main(string[] args) {
int num1 = 0;
int num2 = 1;
bool bool1 = Convert.ToBoolean(num1);
bool bool2 = Convert.ToBoolean(num2);
Console.WriteLine($"0 转 bool: {bool1}");
Console.WriteLine($"1 转 bool: {bool2}");
Console.ReadLine();
}
}
}
输出
0 转 bool: False 1 转 bool: True
0 视为 false,任意非零整数均视为 true。核心对比与选择指南
| 场景 | 推荐方式 | 理由 |
|---|---|---|
| 数值类型扩大(无损) | 隐式转换 | 代码最简洁,零风险 |
| 数值类型缩小(可能丢失) | 显式转型 (T)value | 明确表达开发者意图 |
| 字符串 → 数值(确信格式合法) | T.Parse() | 性能最好,语义明确 |
| 字符串 → 数值(格式不确定) | T.TryParse() | 无异常开销,模式匹配友好 |
| 任意类型 → string | Convert.ToString() 或 .ToString() | 前者处理 null 安全,后者需实例非空 |
| 复杂/跨类型转换 | Convert 类 | 内置溢出检查、null 处理、格式支持 |
| 用户自定义类型转换 | 运算符重载 implicit/explicit operator | 语言级支持,用法最自然 |
掌握这些转换技术,你将能编写出类型安全、意图清晰、运行时错误最少的 C# 代码。
C语言
- ASTM A1018 CS Type B 低碳钢规格与典型性能参数
- ASTM A424 Type II 低碳钢规格与性能指标
- ASTM A424 Type I 低碳钢关键性能与应用表现
- ASTM A792 CS Type A 镀铝锌钢板 — 低碳钢基材性能与规格详解
- ASTM A53 Grade A Type E 电阻焊钢管 — 规格与关键性能参数
- ASTM A53 Grade A Type S 无缝钢管 — 规格与关键性能参数
- ASTM A792 Grade CS Type C 镀铝锌钢板 — 关键性能与规格参数
- ASTM A653 CS A类:规格与关键性能
- 精通Python类型转换与强制转换:综合指南
- 精通 Python 数字、类型转换与数学运算
- 掌握 Java 类型转换:从自动拓宽到强制收窄及更多
- Java 泛型深度解析:类型安全、擦除机制与通配符实战