C# 数据类型转换 显式转型、隐式转型、强制转型
C# 的类型转换有?显式转型 和 隐式转型 两种方式。 显式转型:有可能引发异常、精确度丢失及其他问题的转换方式。需要使用手段进行转换操作。 隐式转型:不会改变原有数据精确度、引发异常,不会发生任何问题的转换方式。由系统自动转换。 ?不同类型的数据进行操作(加减乘除赋值等等),是需要进行 类型转换 后,才能继续操作。所以需要“类型转换”。 ? 隐式转型 隐式转型容易理解,当两种或多种数据类型进行某种操作时,不需要干预,系统会自动进行隐式转换。 如 int i = 66666;
long b = i; //转为 long 类型后为 b 赋值
通常情况下,多种 值类型 进行计算时,系统会自动进行隐式转型,并且总是转为范围更大的数据类型,并且不会发生精确度变化、数字大小变化等等。 显式转型 问题是,但你需要把一个 long 类型的数据转成 int 时,又或者让 string 与 int 互转,当数据小数点太多时,这时候就必须使用?显式转型。 ? 在继续下列教程前,要想说明一点。 char 是整型! 虽然char存储的是字符而不是数字,但它的确是整型,翻回上面看一下图,可以发现。 也就是说,char是可以参与算术运算的。但并不是直接参与,而是char的基础值。c# 中的char值是基于Unicode的。通过Unicode,任意字符都可以解释成数字。 ? 一,使用 ([type])? 转型操作符 此方法适用与值类型转换( string属于引用类型) 在需要转换的变量前加上( [类型] )即可 请仔细观察下面两图的差异 第二张图中的代码中,第二行,为 int b = (int)i;?? 在需要转换的变量前使用 ([type]) 这种格式进行转换,如(int)、(float)、(long) 注意, 此种方法只能对?值类型?数据进行转换。 ?不应将范围大的类型 往 小 转换 或 将浮点型转为整形,不能将超范围的往小了转。 ? 例如 float 转为 int,?精确度会被自动丢失 输出 ? 666 ?- - - 将大于其类型范围的数给它时,会发生溢出。 ? char 可以直接跟 int 或 long 使用。 int a ='1' + '3'; //小转大
char b = (char)a; //大转小
int c = 'a' + '5'; //char可以直接转为 int
注意上下例子的不同 ,int 直接转为char,会报错 ? 第二,[Type].Parse() ?([type]) 方法是无法在值类型、引用类型( string 类型)间转换的。 但每种数据类型都提供一个Parse()方法,它允许把?字符串?转成对应的 数值类型。 int.Parse() float.Parse() ... ... 请看例子 string str = "666";
long i = int.Parse(str);
Console.WriteLine($"{i},{i.GetType()}");
Console.ReadKey();
(图如) ? 注意, Parse() 是专为 string 类型转成 值类型 提供功能的! Parse() 是为符合数字格式的 string 类型进行转换! ? 下面的例子都是错误用法 ! ?Parse() 是将符合数字格式的字符串转为数字,也就是说,
例子 1? ? ?( )? 括号内的内容不是字符串 例子 2? ?变量 str 的内容不是 有效数字格式 ? 第三,[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? 允许将一种类型转为另一种类型。 常见 类型列表: 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 在转换是也需要注意 格式 才能转换成功。 ? ? ? ?同样,此方式也会发生精确度、数字大小改变 ? ?第五,System.Convert .Tostring() 每种数据类型都提供了转为字符串类型的方法 ToString() 无论是值类型还是DateTime 等各种引用类型。 ToString()使用方法最为简单,请留意下列例子的红色背景部分 using System; System.IO; public class Test { static void Main() { int a = 666; string aa = a.ToString(); Console.WriteLine($"{aa}"); float b = 666.666Fstring 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 = 0int e = x / y; } catch (Exception ex) { ee = ex.ToString(); Console.WriteLine(${ee}); } Console.ReadKey(); } } 看到了吧?无论什么类型,只需在后面加上 ToString() , 都能 输出 string 类型的内容。(不是转为 string 类型!) 当然,ToString() 是一个方法,并提供了 一下传入参数,每种类型都有几个重载的 TOString() 方法,例如DateTime的 string ToString( format,IFormatProvider provider); format); ToString(IFormatProvider provider); override string ToString(); ? 其它方面不再赘述。 ? 复制下列代码到控制台,看看输出了什么 a.ToString(); Console.WriteLine($ b.ToString(); Console.WriteLine($ c.ToString(); Console.WriteLine($ d.ToString(); Console.WriteLine($ ex.ToString(); Console.WriteLine($); } Console.ReadKey(); } } ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |