5 - 类型转换
开始学习C#脚本语言,为Unity学习奠定基础。这次学习的是C#中类型转换有关隐式转换和显式转换的内容。
概念
类型转换就是变量在不同数据类型之间的相互转换,分为隐式和显式两种。
隐式转换
隐式转换就是不同类型之间的自动转换(大范围装小范围),我们无需考虑。
相同大类型之间的转换
对于一般的相同大类型间的隐式转换,只需遵循”大范围装小范围类型“的规则即可。例如有符号整数之间的转换:
long l = 1;
int i = 1;
short s = 1;
sbyte sb = 1;
// int -> long 的隐式转换, 用大范围装小范围类型
l = i;
// long -/> int, 不能用小范围类型装大范围类型
// i = l;
而有一些隐式转换有特例,例如浮点数之间的转换:
decimal de = 1.1m;
double d = 1.1;
float f = 1.1f;
// decimal无法通过隐式转换存储double和float
// de = d;
// de = f;
对于之前提到的特殊类型(bool
,char
,string
)则不存在隐式转换。
不同大类型之间的转换
首先看看有/无符号整数大类型之间的隐式转换:
// 有符号
sbyte sb = 1;
short s = 1;
int i = 1;
long l = 1;
// 无符号
byte b = 1;
ushort us = 1;
uint ui = 1;
ulong ul = 1;
// 无符号装有符号不能装, 因为有符号类型范围大
// b = sb;
// 有符号装无符号可以装, 但需要注意范围问题
// uint -/> int, uint正数范围比int大
// i = ui;
// byte -> int
i = b;
然后是浮点数和整数之间的隐式转换:
// 浮点数
decimal de = 1.1m;
double d = 1.1;
float f = 1.1f;
// 浮点数装整数: 浮点数可以装任何类型的整数
f = l;
f = ul;
de = l;
de = ul;
// 整数装浮点数:
// 整数不能隐式存储浮点数, 浮点数范围比整数大
然后是特殊类型和其他类型的转换:
bool bo = true;
char ch = '1';
string str = "123";
// bool: 没有办法和其他类型相互隐式转换
// bo = i;
// char: 无法隐式存储其他类型变量
// ch = i;
// 但能被部分整型和浮点数存储(范围0~65535)
i = ch;
f = ch;
// string: 没有办法和其他类型相互隐式转换
// i = str;
// f = str;
总结
隐式转换的规则就是 高精度(大范围)装低精度(小范围):
double
->float
-> 整数 ->char
decimal
-> 整数 ->char
string
和bool
不参与隐式转换
显式转换
就是手动强制转换类型。
括号强转
例如强行让小范围的装大范围的数:
s = (short)i;
可能会出现范围问题造成的上/下溢出异常。并且bool
和string
类型也不能用括号强转。
使用Parse
可以使用变量类型.Parse("字符串")
将字符串转换为对应类型的变量,前提是字符串是合法的(类型和范围均正确)。
int i = int.Parse("123");
bool b = bool.Parse("true");
char ch = char.Parse("A");
使用Convert
可以用Convert.To目标类型(变量/常量)
更准确的进行显式转换,前提是变量/常量合法。
int a = Convert.ToInt32("123");
其他类型转string
只需用变量.ToString()
即可:
string str = 123.ToString();
str = 'A'.ToString();
str = true.ToString();
参考资料
- 【唐老狮】Unity基础课程之C#入门