C# 数据类型转换 显式转型、隐式转型、强制转型

内容纲要

C# 的类型转换有 显式转型隐式转型 两种方式。

显式转型:有可能引发异常、精确度丢失及其他问题的转换方式。需要使用手段进行转换操作。

隐式转型:不会改变原有数据精确度、引发异常,不会发生任何问题的转换方式。由系统自动转换。

 不同类型的数据进行操作(加减乘除赋值等等),是需要进行 类型转换 后,才能继续操作。所以需要“类型转换”。

 

隐式转型

隐式转型容易理解,当两种或多种数据类型进行某种操作时,不需要干预,系统会自动进行隐式转换。

        int i = 66666;
        long b = i;    //转为 long 类型后为 b 赋值

 通常情况下,多种 值类型 进行计算时,系统会自动进行隐式转型,并且总是转为范围更大的数据类型,并且不会发生精确度变化、数字大小变化等等。

《C# 数据类型转换   显式转型、隐式转型、强制转型》

《C# 数据类型转换   显式转型、隐式转型、强制转型》

显式转型

问题是,但你需要把一个 long 类型的数据转成 int 时,又或者让 string 与 int 互转,当数据小数点太多时,这时候就必须使用 显式转型。

 

在继续下列教程前,要想说明一点。

char 是整型!

虽然char存储的是字符而不是数字,但它的确是整型,翻回上面看一下图,可以发现。

也就是说,char是可以参与算术运算的。但并不是直接参与,而是char的基础值。c# 中的char值是基于Unicode的。通过Unicode,任意字符都可以解释成数字。

 

一,使用 ([type])  转型操作符

此方法适用与值类型转换( string属于引用类型)

在需要转换的变量前加上( [类型] )即可

请仔细观察下面两图的差异

《C# 数据类型转换   显式转型、隐式转型、强制转型》

《C# 数据类型转换   显式转型、隐式转型、强制转型》

第二张图中的代码中,第二行,为 int b = (int)i;  

在需要转换的变量前使用 ([type]) 这种格式进行转换,如(int)、(float)、(long)

注意,

此种方法只能对 值类型 数据进行转换。

 不应将范围大的类型 往 小 转换将浮点型转为整形不能将超范围的往小了转

 

例如 float 转为 int, 精确度会被自动丢失

《C# 数据类型转换   显式转型、隐式转型、强制转型》

输出   666

 – – –

将大于其类型范围的数给它时,会发生溢出。

《C# 数据类型转换   显式转型、隐式转型、强制转型》

 

char 可以直接跟 int 或 long 使用。

            int a ='1' + '3';  //小转大
            char b = (char)a;  //大转小
            int c = 'a' + '5';  //char可以直接转为 int

  


  注意上下例子的不同 ,int 直接转为char,会报错

《C# 数据类型转换   显式转型、隐式转型、强制转型》

 

第二,[Type].Parse()

 ([type]) 方法是无法在值类型、引用类型( string 类型)间转换的。

但每种数据类型都提供一个Parse()方法,它允许把 字符串 转成对应的 数值类型。

int.Parse()

float.Parse()

… …

请看例子

        string str = "666";
        long i = int.Parse(str);
        Console.WriteLine($"{i},{i.GetType()}");
        Console.ReadKey();

(图如)

《C# 数据类型转换   显式转型、隐式转型、强制转型》

 

注意,

Parse() 是专为 string 类型转成 值类型 提供功能的!

Parse() 是为符合数字格式的 string 类型进行转换!

 

下面的例子都是错误用法 !

 Parse() 是将符合数字格式的字符串转为数字,也就是说,

  • ( )括号内的必须为字符串 !
  • 字符串的内容必须为数字 !

例子 1     ( )  括号内的内容不是字符串

《C# 数据类型转换   显式转型、隐式转型、强制转型》

例子 2   变量 str 的内容不是 有效数字格式

 《C# 数据类型转换   显式转型、隐式转型、强制转型》

第三,[Type].TryParse()

格式如下

int.TryParse()

float.TryParse()

… …

 .TryParse() 与 .Parse()  相似,但是使用形式不太一样,

[类型].TryParse(要更改的字符串,out 存储到哪个变量); 

最重要的不同点在于, .TryParse()  在转换失败时,不会引发异常,而是返回 flase

例子

        string str = "666";
        int i;
        bool b = int.TryParse(str,out i);    //接收转换结果
或者

        string str = "666";
        int i;
        int.TryParse(str,out i);    //不接收转换结果

  如果你不知道 out 的使用,请查阅 C#中的out参数/ref参数/params可变参数

第四,System.Convert

方法例子

System.Convert.ToSingle();
System.Convert.ToInt32();
System.Convert.ToDouble();

… …

System.Convert  允许将一种类型转为另一种类型。

常见 类型列表: char、sbyte、short、int、long、uint、ulong、float、double、decimal、string、bool … …

但是,同样需要格式支持!

        string str = "666";
        int a= System.Convert.ToInt32(str);        //正确

        string str = "666.66";
        int a= System.Convert.ToInt32(str);        //报错

        int a = 66666;
        bool c = System.Convert.ToBoolean(a);        //正确

        string str = "666.66";
        bool c = System.Convert.ToBoolean(str);        //报错

  System.Convert 在转换是也需要注意 格式 才能转换成功。

       同样,此方式也会发生精确度、数字大小改变

《C# 数据类型转换   显式转型、隐式转型、强制转型》

 

 第五,System.Convert

.Tostring()

每种数据类型都提供了转为字符串类型的方法 ToString()

无论是值类型还是DateTime 等各种引用类型。

ToString()使用方法最为简单,请留意下列例子的红色背景部分

using System;
using System.IO;

public class Test
{

    static void Main()
    {
        int a = 666;
        string aa = a.ToString();
        Console.WriteLine($"{aa}");

        float b = 666.666F;
        string bb = b.ToString();
        Console.WriteLine($"{bb}");

        DateTime c = DateTime.Now;
        string cc = c.ToString();
        Console.WriteLine($"{cc}");

        FileInfo d = new FileInfo("E:\\test.txt");
        string dd = d.ToString();
        Console.WriteLine($"{dd}");

        string ee;
        try
        {
            int x = 1;
            int y = 0;
            int e = x / y;
        }
        catch (Exception ex)
        {
            ee = ex.ToString();
            Console.WriteLine($"{ee}");
        }

        Console.ReadKey();
    }

}

看到了吧?无论什么类型,只需在后面加上 ToString() , 都能 输出 string 类型的内容。(不是转为 string 类型!)

当然,ToString() 是一个方法,并提供了 一下传入参数,每种类型都有几个重载的 TOString() 方法,例如DateTime的

public string ToString(string format, IFormatProvider provider);
public string ToString(string format);
public string ToString(IFormatProvider provider);
public override string ToString();

 

其它方面不再赘述。

 

复制下列代码到控制台,看看输出了什么

using System;
using System.IO;

public class Test
{

    static void Main()
    {
        int a = 666;
        string aa = a.ToString();
        Console.WriteLine($"{aa}");

        float b = 666.666F;
        string bb = b.ToString();
        Console.WriteLine($"{bb}");

        DateTime c = DateTime.Now;
        string cc = c.ToString();
        Console.WriteLine($"{cc}");

        FileInfo d = new FileInfo("E:\\test.txt");
        string dd = d.ToString();
        Console.WriteLine($"{dd}");

        string ee;
        try
        {
            int x = 1;
            int y = 0;
            int e = x / y;
        }
        catch (Exception ex)
        {
            ee = ex.ToString();
            Console.WriteLine($"{ee}");
        }

        Console.ReadKey();
    }

}

 

点赞
  1. Thanks for your own work on this website. My mum takes pleasure in setting aside time for research and it is simple to grasp why. We notice all relating to the powerful way you provide very important tips and hints via your website and therefore strongly encourage response from visitors on this theme while our own simple princess is without a doubt understanding so much. Take pleasure in the rest of the year. Your performing a useful job.

发表评论

邮箱地址不会被公开。 必填项已用*标注

You must enable javascript to see captcha here!