C# 类型转换
·
在 C# 中,类型转换(Type Conversion)主要分为隐式转换、显式转换、类型转换方法和安全类型转换几种方式。
1. 隐式转换(Implicit Conversion)
数据类型兼容且不会丢失数据时,编译器自动完成转换。
int num = 100;
long bigNum = num; // int -> long
float f = 10;
double d = f; // float -> double
常见隐式转换:
| 源类型 | 目标类型 |
|---|---|
| byte | short、int、long、float、double、decimal |
| short | int、long、float、double、decimal |
| int | long、float、double、decimal |
| float | double |
2. 显式转换(Cast)
可能发生数据丢失时,需要强制转换。
double d = 123.45;
int i = (int)d;
Console.WriteLine(i); // 123
long l = 1000;
int n = (int)l;
注意:
double d = 9999999999;
int i = (int)d; // 可能溢出
3. Convert 类转换
适用于字符串与基础数据类型之间转换。
string str = "123";
int i = Convert.ToInt32(str);
double d = Convert.ToDouble(str);
bool b = Convert.ToBoolean("true");
示例:
string price = "99.8";
double p = Convert.ToDouble(price);
Console.WriteLine(p);
4. Parse 方法
将字符串转换为指定类型。
string str = "100";
int num = int.Parse(str);
double d = double.Parse("123.45");
DateTime dt = DateTime.Parse("2025-01-01");
异常情况:
int.Parse("abc"); // FormatException
5. TryParse(推荐)
转换失败不会抛异常。
string str = "123";
if (int.TryParse(str, out int result))
{
Console.WriteLine(result);
}
else
{
Console.WriteLine("转换失败");
}
简写:
if (int.TryParse("456", out var value))
{
Console.WriteLine(value);
}
6. ToString()
转换为字符串。
int num = 100;
string str = num.ToString();
格式化:
double price = 1234.567;
Console.WriteLine(price.ToString("F2")); // 1234.57
Console.WriteLine(price.ToString("N")); // 1,234.57
Console.WriteLine(price.ToString("P")); // 百分比
7. as 运算符
仅适用于引用类型和可空类型。
object obj = "Hello";
string str = obj as string;
if (str != null)
{
Console.WriteLine(str);
}
等价于:
string str = obj is string ? (string)obj : null;
8. is 模式匹配(推荐)
object obj = "Hello";
if (obj is string text)
{
Console.WriteLine(text);
}
9. object 与具体类型转换
装箱(Boxing):
int num = 100;
object obj = num;
拆箱(Unboxing):
object obj = 100;
int num = (int)obj;
错误示例:
object obj = "100";
int num = (int)obj; // InvalidCastException
正确做法:
int num = Convert.ToInt32(obj);
10. 自定义类型转换
通过 implicit 和 explicit 关键字实现。
public class Meter
{
public double Value { get; set; }
public static implicit operator double(Meter m)
{
return m.Value;
}
public static explicit operator Meter(double d)
{
return new Meter { Value = d };
}
}
使用:
Meter m = (Meter)10.5;
double d = m;
Console.WriteLine(d);
常用转换速查表
| 转换场景 | 推荐方式 |
|---|---|
| int → long | 隐式转换 |
| double → int | (int) |
| string → int | int.TryParse() |
| string → double | double.TryParse() |
| 任意类型 → string | ToString() |
| object → 具体类型 | is 或 (类型) |
| 引用类型转换 | as |
| 自定义对象转换 | implicit/explicit |
实际开发建议
- 字符串转数字优先使用
TryParse()。 - 引用类型判断优先使用
is模式匹配。 - 避免频繁装箱/拆箱,影响性能。
- 涉及金额时优先使用
decimal而非double。 - 显式转换前注意数据范围,防止溢出。
更多推荐
所有评论(0)