Convert.To类型(变量)和checked((类型)变量)的本质区别是什么?
<<C#入门经典>>上面说,C#工程的Build选项的"高级"选项卡里面,有一个单选框叫做
"Check for arithmetic overflow/underflow"。这个勾选以后checked(类型)变量)会有运行时的溢出检查
short s = 3333;
byte b1 = (byte)s;
byte b2 = Convert.ToByte(s);//和checked((类型)变量)强制类型转换的本质区别是什么?
也就是说,b1在赋值的时候,会有溢出检查。这个效果和b2这一行相同。
那么我的问题是:
(1) 都是溢出检查,checked((byte)s)和Convert.ToByte(s)是完全一样的行为吗,还是稍有不同?
(2) 是不是说,编译器会根据我是否勾选了溢出检查,来决定checked(())是什么都不做,还是内部调用Convert.ToByte? 显示转换和Convert.ToXXX之间到底有什么关系呢?
启用或者不启用溢出检查,你难道不能直截了当地理解其含义吗?为什么要随便纠结其它的函数,非要知道.net内部是不是调用你指定的其它函数呢? a标签链接点击后失效几秒钟如何实现
如果你关心 MSIL 代码,那么你可以贴出来启用和不启用“溢出检查”时产生的 MSIL 语言程序两种代码。我不反对你把这2种代码贴出来。在任何一个非常准确毫无争议的系统功能上,你应该自己动手,不要无限制地千方百计罗列各种浅层问题。
我告诉你一个原则:浅层的不重要的问题,你应该学会自己动手,或者先不要纠结。
(1) 都是溢出检查,checked((byte)s)和Convert.ToByte(s)是完全一样的行为吗,还是稍有不同
目前她们的行为是一样的,但是 javascript高级程设计中讲解函数递归调用
checked((byte)s)的行为是由C#语言规范定义的,比如DotNet和Mono的结果都应该是一样的。
而Convert.ToByte则是函数实现,它的行为要看函数的说明书和具体内部实现。甚至将来的dotnet版本,都可能引入差别。
(2) 是不是说,编译器会根据我是否勾选了溢出检查,来决定checked(())是什么都不做,...
如果你在代码里显式的调用checked,那么它将优先于“是否勾选了溢出检查”。
(举个例子,你勾选了溢出检查,代码 byte b1 = unchecked((byte)s);也不会抛出异常)