C#学习笔记 类型转换

在 C# 中,类型转换有两种形式:

(3) 对被转换类型的区别 int.Parse 是转换 String 为 int, Convert.ToInt32 是转换继承自 Object 的对象为 int 的(可以有很多其它类型的数据)。你得到一个 object 对象, 你想把它转换为 int, 用 int.Parse 就不可以, 要用 Convert.ToInt32。

  • 隐式类型转换 - 这些转换是 C# 默认的以安全方式进行的转换, 不会导致数据丢失。例如,从小的整数类型转换为大的整数类型,从派生类转换为基类。
  • 显式类型转换 - 显式类型转换,即强制类型转换。显式转换需要强制转换运算符,而且强制转换会造成数据丢失。
  • double d = 5673.74;
                int i;
    
                // 强制转换 double 为 int
                i = (int)d;
                Console.WriteLine(i);

    当上面的代码被编译和执行时,它会产生下列结果:5673


  • C# 类型转换方法

  • 序号 方法 & 描述
    1 ToBoolean
    如果可能的话,把类型转换为布尔型。
    2 ToByte
    把类型转换为字节类型。
    3 ToChar
    如果可能的话,把类型转换为单个 Unicode 字符类型。
    4 ToDateTime
    把类型(整数或字符串类型)转换为 日期-时间 结构。
    5 ToDecimal
    把浮点型或整数类型转换为十进制类型。
    6 ToDouble
    把类型转换为双精度浮点型。
    7 ToInt16
    把类型转换为 16 位整数类型。
    8 ToInt32
    把类型转换为 32 位整数类型。
    9 ToInt64
    把类型转换为 64 位整数类型。
    10 ToSbyte
    把类型转换为有符号字节类型。
    11 ToSingle
    把类型转换为小浮点数类型。
    12 ToString
    把类型转换为字符串类型。
    13 ToType
    把类型转换为指定类型。
    14 ToUInt16
    把类型转换为 16 位无符号整数类型。
    15 ToUInt32
    把类型转换为 32 位无符号整数类型。
    16 ToUInt64
    把类型转换为 64 位无符号整数类型。

    隐式转换:C# 默认的以安全方式进行的转换。本质是从小存储容量数据类型自动转换为大存储容量数据类型,从派生类转换为基类。

  • namespace TypeConvertion
    {   class Class1
        {
    
        }
    
        class Class2 : Class1 //类Class2是类Class1的子类
        {
    
        }
        class Program
        {
            static void Main(string[] args)
            {
                int inum = 100;
                long lnum = inum; // 进行了隐式转换,将 int 型(数据范围小)数据转换为了 long 型(数据范围大)的数据
                Class1 c1 = new Class2(); // 这里也是隐式转换,将一个新建的 Class2 实例转换为了其基类 Class1 类型的实例 C1
            }
        }
    }

    显式转换:通过用户使用预定义的函数显式完成的,显式转换需要强制转换运算符。

    转换类型的范围大小和从属关系和隐式转换相反。显式转换可能会导致数据出错,或者转换失败,甚至无法编译成功。

    double dnum = 100.1;
    int ifromd = (int)dnum; //double类型显式转换转为int类型
    
    
    Class1 c11 = new Class1();
    Class2 c22 = c11 as Class2; //使用as进行显式转换
    Console.WriteLine(c22 is Class1);
    Console.WriteLine(c22 is Class2);

    类型之间的转换 - Convert 和 Parse

  • string locstr = 123.ToString();
    
    //如果要将"locstr"转成整型数
    
    //方法一: 用 Convert 
    int i = Convert.ToInt16(locstr);
    
    //方法二: 用 Parse
    int ii = int.Parse(locstr);

    int.TryParse(string s,out int i)

    该方式也是将数字内容的字符串转换为int类型,但是该方式比int.Parse(string s) 好一些,它不会出现异常,最后一个参数result是输出值,如果转换成功则输出相应的值,转换失败则输出0。

    class test
    {
        static void Main(string[] args)
        {
            string s1="abcd";
            string s2="1234";
            int a,b;
            bool bo1=int.TryParse(s1,out a);
            Console.WriteLine(s1+" "+bo1+" "+a);
            bool bo2=int.TryParse(s2,out b);
            Console.WriteLine(s2+" "+bo2+" "+b);
        }
    }

    Convert.ToInt32() 与 int.Parse() 的区别

  • 没搞清楚 Convert.ToInt32 和 int.Parse() 的细细微区别时千万别乱用,否则可能会产生无法预料的结果,举例来说:假如从 url 中取一个参数 page 的值,我们知道这个值是一个 int,所以即可以用 Convert.ToInt32(Request.QueryString["page"]),也可以用 int.Parse(Request.QueryString["page"]),但是如果 page 这个参数在 url 中不存在,那么前者将返回 0,0 可能是一个有效的值,所以你不知道 url 中原来根本就没有这个参数而继续进行下一下的处理,这就可能产生意想不到的效果,而用后一种办法的话没有 page 这个参数会抛出异常,我们可以捕获异常然后再做相应的处理,比如提示用户缺少参数,而不是把参数值当做 0 来处理。

    (1) 这两个方法的最大不同是它们对 null 值的处理方法: Convert.ToInt32(null) 会返回 0 而不会产生任何异常,但 int.Parse(null) 则会产生异常。

    (2) 对数据进行四舍五入时候的区别

  •  a. Convert.ToInt32(double value) 如果 value 为两个整数中间的数字,则返回二者中的偶数;即 3.5 转换为 4,4.5 转换为 4,而 5.5 转换为 6。不过 4.6 可以转换为 5,4.4 转换为 4 。
  •  b. int.Parse("4.5") 直接报错:"输入字符串的格式不正确"
  •  c. int(4.6) = 4 Int 转化其他数值类型为 Int 时没有四舍五入,强制转换。

    为了保险,可以用try、catch来解决此问题。

  •  try
            {
               Console.WriteLine("输入数字,将计算出它加一的答案");
               int a = int.Parse(Console.ReadLine());   //有可能会抛出异常
               Console.WriteLine("答案是{0}",++a);   //如果没有异常,程序才会进入这一步
            }
            catch (Exception)
            {
                Console.WriteLine("无法转换");  //如果捕获到异常,就说“无法转换”
            }
             Console.ReadKey();

上一篇:docker-compose自定义容器名称报错:ERROR: In file './docker-compose.yml', services 'container_na


下一篇:docker-compose