C#每天一学之checkedamp;unchecked

news/2024/7/19 17:40:32 标签: C, C++, C#, Firefox, Facebook

C#每天一学之checked&unchecked

checked和unchecked操作符用于整型算术运算时控制当前环境中的溢出检查。下列运算参与了checked和unchecked检查(操作数均为整数):

1)  预定义的++和―― 一元运算符。

2)  预定义的-一元运算符。

3)  预定义的+、-、×、/等二元操作符。

4)  从一种整型到另一种整型的显示数据转换。

 

(一)使用checked

若运算是常量表达式,则产生编译错误:The operation overflows at complie time in checked mode.

若运算是非常量表达式,则运行时会抛出一个溢出异常:OverFlowException异常。

checked 的用法可以是checked(//运算代码),也可以是checked{//运算代码},一般都是小量的代码。

先看下面代码:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->             Byte b  =   100 ;

            b 
+=   200 ;

            Console.WriteLine(b.ToString());

 结果并不是我们预想的输出300,输出是44。假设我们用于计算那是多么的危险,上述代码编译时编译器并没有告诉程序员运算溢出。而是偷偷的干了坏事...

下面我们加上checked,看效果如何:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->              byte  b  =   200 ;
            
checked
            { 
                b 
+=   200 ;
            }
            Console.WriteLine( b.ToString());

可以看到程序并没有输出,而是在运行时抛出OverflowException,干了try catch的事情,告诉程序员说运算溢出了,赶快修bug。在运行时才抛出异常,在测试中带来些许麻烦,那么如何在程序编译时就抛出错误呢,事实上编译时是不能确定运算结果的,也就是说运算结果是在运行是才能确定,所以只有在运行时checked才做运算溢出检查。但是下列代码是编译不通过的(地球人都知道)

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->              byte  b;
            
checked
            {
                b 
=   256 ;
            }
            Console.WriteLine( b.ToString());

输出错误 Constant value '300' cannot be converted to a 'byte' ,byte的范围是0~255嘛,编译当然报错。

需要指出的是,看下面代码:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> Byte b  =   100 ;
=  (Byte) checked (b  +   200 ); // 不抛出System.OverflowException异常信息

这里解释一下,因为 b+ 200 的结果是int32,checked是对int32的检查当然没有运算溢出,但是再将结果转换成byte时没有checked,所以返回值会被截掉不符合目标类型的高位,输出不正确的结果。

 

(二)使用unchecked

无论运算是否是常量表达式,都没有编译错误或是运行时异常发生,只是返回值被截掉不符合目标类型的高位,用法类似checked。

参考资料:

[1]C#中的checked、unchecked操作符http://www.knowsky.com/301786.html

[2]基元类型和Checked、UnChecked操作符的使用 http://www.cnblogs.com/noviceliu/archive/2009/03/11/1408461.html

作者: 王德田 发表于 2011-02-28 18:01 原文链接

评论: 0 查看评论 发表评论


最新新闻:
· Firefox 4 将是 Mozilla 最后一个大发行版(2011-03-01 17:06)
· 凡客V+商城月均销售额过6000万(2011-03-01 16:33)
· 未来,很好玩 —— 谈下一代掌机(2011-03-01 16:31)
· Red Hat改变内核源代码打包方式(2011-03-01 16:29)
· 分析预计Facebook今年广告营收将接近22亿美元(2011-03-01 16:25)

编辑推荐:在西方的程序员眼里,东方的程序员是什么样的?

网站导航:博客园首页  我的园子  新闻  闪存  小组  博问  知识库


http://www.niftyadmin.cn/n/1126535.html

相关文章

Asp.net开发常用技巧收集

1. 打开新的窗口并传送参数&#xff1a; 传送参数&#xff1a; Response.write("<script>window.open(*.aspx?id"this.DropDownList1.SelectIndex"&id1"")</script>") 接收参数&#xff1a; string a Request.QueryString…

用apt爽还是apt-get爽

debian系linux发行版的高级软件包管理工具叫apt(for Advanced Package Tool) 。 debian的包管理体系很立体&#xff0c;dpkg -> apt ->aptitude -> synaptic。 我们在各种教程中看到的最常用的apt命令是apt-get、apt-cache&#xff1b;我这两天突发奇想&#xff0c;为…

简单的刷票系统(突破IP限制进行投票) (转)

前言   相信大家平时肯定会收到朋友发来的链接&#xff0c;打开一看&#xff0c;哦&#xff0c;需要投票。投完票后弹出一个页面&#xff08;恭喜您&#xff0c;您已经投票成功&#xff09;&#xff0c;再次点击的时候发现&#xff0c;啊哈&#xff0c;您的IP&#xff08;***…

[C#]ADO访问多数据库的C#库

[C#]ADO访问多数据库的C#库 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循“署名-非商业用途-保持一致”创作公用协议 一&#xff0c;C# Database 库 整了一个支持通过ADO方式访问多种数据库(OLE&#xff0c;MySQL&#xff0c;SQL Server&#xff0c;Oracle)的 C# 库 Dat…

【益智题】如何调整手表?

一个住在深山中的猎人&#xff0c;他有一只机械表&#xff0c;这天&#xff0c;表因忘了上发条而停了。他决定下山到市集购买日用品&#xff0c;出门前他先上紧机械表的发条&#xff0c;并看了当时的时间是6:30&#xff08;时间不准&#xff09;。途中经过电信局&#xff0c;猎…

PHP环境搭建——Apache

1.PHP环境安装前我们需要知道PHP给我们带来的功能是什么&#xff1f; Php主要用在三个领域 &#xff08;1&#xff09; 网站和web应用程序 &#xff08;2&#xff09; 命令行脚本 &#xff08;3&#xff09; 桌面&#xff08;GUI&#xff09;应用程序 在通常…

[Java20071101]JDK配置

1.下载和安装JDK的相关版本 2.右键点 我的电脑 打开属性 然后选择“高级”里面的“环境变量” 在新的打开界面中的 系统变量 需要设置三个属性 java_home , path ,classpath 3.在没安装过jdk的环境下 path属性是本来存在的 而java_home和classpath是不存在的 …

C#中结构体和类的区别

C#中结构体和类的区别 1.结构体是值类型&#xff0c;类是引用类型 虽然结构体的初始化也使用了new操作符&#xff0c;可是结构体对象依然分配在堆栈上而不是堆上&#xff0c;如果不使用“新建”(new)&#xff0c; 那么在初始化所有字段之前&#xff0c;字段将保持未赋值状态…