C#:数据类型转换之显示类型转换
数据类型转换场景在我们日常编码过程中十分常见:
场景1:从控制台读取输入的数值,然后进行数学运算。
Console.WriteLine("输入第一个数"); var a= Console.ReadLine(); Console.WriteLine("输入第二个数"); var b= Console.ReadLine(); var c = a + b; Console.WriteLine($"{a}+{b}={c}");
输出结果:
这样的结果肯定不是我们希望的,仔细查看便可知道ReadLine()方法从控制台读取到的是string类型的值,所以我们需要对读取到的值进行显示类型转换。
类型转换有很多种形式
第一种使用:Convert类提供的方法进行类型转换。
Console.WriteLine("输入第一个数"); var a= Console.ReadLine(); Console.WriteLine("输入第二个数"); var b= Console.ReadLine(); int x = Convert.ToInt32(a); int y = Convert.ToInt32(b); int c = x + y; Console.WriteLine($"{a}+{b}={c}");
输出结果:
第二种使用:int类型的Parse方法进行类型转换
Console.WriteLine("输入第一个数"); var a= Console.ReadLine(); Console.WriteLine("输入第二个数"); var b= Console.ReadLine(); int x = int.Parse(a); int y = int.Parse(b); int c = x + y; Console.WriteLine($"{a}+{b}={c}");
输出结果:
虽然以上两种方法都能够进行类型转换,但是代码会出现一个问题:类型转换异常。比如我们输入第一个数是1q,看一下会出现什么情况。
第三种:微软实现也考虑到了这种隐患,所以提供了一种安全的转换方法给我们:TryParse()
Console.WriteLine("输入第一个数"); var a= Console.ReadLine(); Console.WriteLine("输入第二个数"); var b= Console.ReadLine(); int x; int.TryParse(a,out x); int y; int.TryParse(b,out y); int c = x + y; Console.WriteLine($"{a}+{b}={c}");
执行结果:
倘若我们输入不合法的字符串,程序也不会报错了。
来看一下API中给出的解释:当转换不成功的时候,会返回一个0值。
第四种:除此之外我们还见过类型转换操作符:(T)x---x是某种数据类型的值,()表示类型转换操作符,T表示要转换成的目标数据类型。
比如:将int类型的数据15转换成short类型,这时候就需要使用类型转换操作符,否则编译时会提示错误。
int a = 15; short b = (short)a; Console.WriteLine(b);
输出:15
类型转换操作符,也会出现一些不安全的情况:如果我们用超出short能够表示的范围的整型数值来转换成short类型,会发生什么呢?
int c = int.MaxValue; short d = (short)c; Console.WriteLine(d);
输出:-1
所以在使用类型转换操作符的时候,要注意可能发生精度丢失。
第五种:拆箱操作--即从object类型转换成普通值类型数据的时候--需要使用显示类型转换。
object a = 15; int b = (int)a; Console.WriteLine(b);
输出:15
但是,对于某些类型,类型转换操作符不能对他们进行显示类型转换
class Stone { public int Age { get; set; } } class Monkey { public int Age { get; set; } }
比如上面的两种类型,我们使用类型转换操作符的时候,是会发生编译期错误的:
第六种:我们需要自己定义类型转换操作符--在需要被转换的类型中自定义类型转换方法,需要用到显式类型转换关键字、操作符关键字。
class Stone { public int Age { get; set; } //explicit 显式类型转换 操作符 //implicit 隐式类型转换操作符 public static explicit operator Monkey(Stone stone) { Monkey monkey = new Monkey(); monkey.Age = stone.Age / 500; return monkey; } }
这样,我们想要将Stone转换成Monkey类型就成为了可能。
//自定义类型转换符 Stone stone = new Stone(); stone.Age = 5000; Monkey monkey = (Monkey)stone; Console.WriteLine(monkey.Age + " " + stone.Age);
从上面的例子可以推测出,类型转换操作符,其实是一个方法的简计法。
总结:显示类型转换,我们常用的有Convert类、各种简单类型的TryParse()方法、简单类型的类型转换操作符。很少需要自己定义类型转换操作符。