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

  • 相关阅读:
    Could not connect to '192.168.80.145' (port 22): Connection failed的解决办法(远程连不上xshell)
    分布式集群HBase启动后某节点的HRegionServer自动消失问题
    Hive环境的安装部署(完美安装)(集群内或集群外都适用)(含卸载自带mysql安装指定版本)
    大数据各子项目的环境搭建之建立与删除软连接(博主推荐)
    TeamViewer的下载、安装和使用(windows7、CentOS6.5和Ubuntu14.04(64bit))(图文详解)
    Python *的下载、安装和使用
    JetBrains PyCharm(Community版本)的下载、安装和初步使用
    Spark SQL概念学习系列之DataFrame与RDD的区别
    手游接入Facebook的那些坑
    J2EE基础篇——十三个规范
  • 原文地址:https://www.cnblogs.com/bigbosscyb/p/13465983.html
Copyright © 2020-2023  润新知