|
|
51CTO旗下网站
|
|
移动端

2.6.1 显式转型

《C# 6.0本质论(第5版)》第2章数据类型,本章将探讨这些数据类型,更深入地研究字符串类型,并引入数组的概念。本节为大家介绍显式转型。

作者:周靖/庞燕 译来源:人民邮电出版社|2017-07-21 16:41

2.6.1 显式转型

在C#中,可以使用转型操作符执行转型。通过在圆括号中指定希望变量转换成的类型,表明你已认可在发生显式转型时可能丢失精度和数据,或者可能造成异常。代码清单2-21将一个long类型的变量转换成int类型的变量,而且显式地告诉系统要尝试这个操作。

代码清单2-21 显式转型的例子

程序员使用转型操作符告诉编译器:“相信我,我知道自己正在干什么。我知道这个值能适应目标类型。”只有程序员像这样做出明确选择,编译器才允许转换。但这也可能只是程序员“一厢情愿”。执行显式转换时,如果数据未能成功转换,“运行时”可能引发异常。所以,完全要由程序员负责确保数据成功转换,或者提供错误处理代码来处理不能成功转换的情况。

高级主题:checked和unchecked转换

C#提供了特殊关键字来标识代码块,指出假如目标数据类型太小,以至于容不下赋值的数据,那么会发生什么情况。假如容不下,数据在赋值时默认会溢出。代码清单2-22展示了一个例子。

代码清单2-22 溢出整数值

  1. class Program  
  2. {  
  3. static void Main()  
  4. {  
  5. // int.MaxValue equals 2147483647  
  6. int n = int.MaxValue;  
  7. nn = n + 1 ;  
  8. System.Console.WriteLine(n);  
  9. }  

输出2-15展示了结果。

输出2-15

  1. -2147483648 

代码清单2-22会在控制台上显示值-2147483648。然而,将上述代码放到一个checked块中,或者在编译时使用checked选项,就会使“运行时”引发System.OverflowException异常。代码清单2-23给出了checked块的语法。

代码清单2-23 checked块示例

  1. class Program  
  2. {  
  3. static void Main()  
  4. {  
  5. checked  
  6. {  
  7. // int.MaxValue equals 2147483647  
  8. int n = int.MaxValue;  
  9. nn = n + 1 ;  
  10. System.Console.WriteLine(n);  
  11. }  
  12. }  

输出2-16展示了结果。

输出2-16

  1. Unhandled Exception: System.OverflowException: Arithmetic operation  
  2. resulted in an overflow at Program.Main() in ...Program.cs:line 12 

在checked块内,如果在运行时发生一次溢出的赋值,就会引发异常。

C#编译器提供了一个命令行选项将默认行为从unchecked改成checked。除此之外,C#还支持unchecked块,它强制不进行溢出检查,不会为块中溢出的赋值引发异常,如代码清单2-24所示。

代码清单2-24 unchecked块示例

  1. using System;  
  2. class Program  
  3. {  
  4. static void Main()  
  5. {  
  6. unchecked  
  7. {  
  8. // int.MaxValue equals 2147483647  
  9. int n = int.MaxValue;  
  10. nn = n + 1 ;  
  11. System.Console.WriteLine(n);  
  12. }  
  13. }  

输出2-17展示了结果。

输出2-17

  1. -2147483648 

即使编译时打开了checked选项,在执行期间,上述代码中的unchecked关键字也会阻止“运行时”引发异常。

并不能因为使用了转型操作符,就可以将一种类型转换为其他任何类型。编译器仍然会检查转型操作的有效性。例如,不能将一个long类型转换成bool类型。因为没有定义这种转换,所以编译器不允许这样的转型。

语言对比:数值转换成布尔值

一些人可能觉得奇怪,C#中居然不存在从数值类型到布尔类型的有效转型,因为这在其他许多语言中都是很普遍的。C#不支持这样的转换,是为了避免可能发生的歧义,比如,—1到底对应true还是false?更重要的是,如同下一章要讲到的那样,这还有助于避免用户在本来应该使用相等操作符的时候使用了赋值操作符。例如,可以避免在本来应该写成if(x==42){...}的时候写成了if(x=42){...}。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:342347198

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

JSP应用开发详解(第二版)

本书结合JSP和Servlet的最新规范,从基本的语法和规范入手,以经验为后盾,以实用为目标,以实例为导向,以实践为指导,深入浅出地讲解了JS...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊