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()方法、简单类型的类型转换操作符。很少需要自己定义类型转换操作符。

原文地址:https://www.cnblogs.com/bigbosscyb/p/13465983.html