c#美味:使用checked语句防止数据溢出
在C#中有一个关键字checked,它用来判断当前上下文中的数值运算和数值转换是否会溢出。如是是常量溢出,那在编译时就能发现;如果是变量溢出,那在运行时会抛出OverflowException。
数值运算有:++ — - (unary) + - * /
有了这个就不用担心数据溢出了。
checked
checked 有两种使用方法:
1.作为操作符来使用
int a = int.MinValue; int c = checked(a--);
执行的时候会抛出异常:
2.检查一大块代码:
这样子会对里面所有的代码都做检查
checked {int a = int.MinValue;int c = a--; }
如下图:
unchecked
和checked对应,还有一个unchecked关键字,用来取消检查。
也是两种使用;
1.作为运算符:
int a = int.MinValue; int c = unchecked(a--);
这样子就不会抛异常了
2.检查一大块代码
unchecked {int a = int.MinValue;int c = a--; }
也不抛异常:
/checked 和/checked-
如果代码里总是要写这么多checked语句是不是很烦?如果能有一个编译参数就好,只有设置了就都会检查。微软也想到了这个,它提供了一个/checked 参数来做,也提供了一个/checked-来取消。
- 溢出检查 /checked,也可以是/checked+
- 溢出不检查 /checked-
当然,你想取消所有的检查也是可以的,命令行参数是/checked-
csc t2.cs /checked
其中csc是编译器csc.exe , t2.cs 是被编译的代码文件。
我想很多人是用Visual Studio吧。VS里也是可以设置的。
步骤如下,我以VS2010为例,(VS2005,2008差不多)
1。在工程上点右键,选择菜单Properties
2。点击“Build”,再点击“Advanced”
3。在打开的对话框中,把“Check for arithmetic overflow/underflow”打上勾
几个注意
1.checked语句只对当前上下文中的代码有效,即不对调用的函数内部做检查。
static void Main(string[] args) {checked{TestFun();}}static void TestFun() {int a = int.MinValue;int c = a--; }
这段代码中。不会跑异常,因为checked关键字没有影响到TestFun内部。如果需要这么做的话,要么在TestFun内部加checked关键字,要么打开全局开关(加编译参数/checked或者VS中设置)。
2.checked,unchecked关键字不检查左移和右移是否溢出。
static void Main(string[] args) {checked{int a = int.MinValue;int c = a>>1;}}
执行不会抛异常:
3.为了性能考虑,建议Debug时做检查,Release时不做检查。
参考资料
/checked (Check Integer Arithmetic)
http://msdn.microsoft.com/en-us/library/h25wtyxf(v=VS.71).aspx
Arithmetic Overflow Checking using checked/unchecked
http://www.codeproject.com/KB/cs/overflow_checking.aspx
C# 3.0 in a Nutshell, 3rd Edition
Chapter 2.4.5.2. Integral overflow
转载于:https://www.cnblogs.com/greenerycn/archive/2010/07/23/use_checked_to_avoid_overflow.html
c#美味:使用checked语句防止数据溢出相关推荐
- access 一亿条数据_循环运算数据溢出
本文讲解了循环运算时数据溢出的解决方法. 对于循环语句在运行过程中数据溢出,可以用下面一行代码搞定. DAO.DBEngine.SetOption dbMaxLocksPerFile, 9999999 ...
- c语言字节溢出,C语言变量定义与数据溢出(初学者)
1.变量定义的一般形式为:类型说明符.变量名标识符等:例:int a,b,c;(abc为整型变量) 在书写变量定义时应注意以下几点: (1)允许在一个类型说明符后,定义多个相同类型的变量.各变量之间用 ...
- 使用SQL语句UPDATE数据,怎样知道是否UPDATE成功
http://www.ixpub.net/thread-1252609-1-1.html 使用SQL语句UPDATE数据,怎样知道是否UPDATE成功 如题,我在RPG中使用SQL语句UPDATE数据 ...
- HQL语句中数据类型转换,及hibernate中createQuery执行hql报错
一.HQL语句中数据类型转换: 我们需要从数据库中取出序号最大的记录,想到的方法就是使用order by子句进行排序(desc倒序),然后取出第一个对象,可是当初设计数据库时(我们是在原来的数据库的基 ...
- mysql sql测试_MySQL语句测试——数据查询
MySQL语句测试--数据查询 3.4 数据查询 一.单表查询 /*1.选择表中的若干列,各个列的先后顺序和语句中列名从左到右的顺序一致 select 目标表达式 from 表名; */ /*(1)s ...
- oracle数据定义语句,oracle(sql)基础篇系列(3)——数据维护语句、数据定义语句、伪列...
oracle(sql)基础篇系列(三)--数据维护语句.数据定义语句.伪列 DML语句 insert 向表中插入新的记录 --三种插入方式 --(1)不写字段的名字,直接按照字段的顺序把值逐个往里插 ...
- c语言变量名必须用小写 常量用大写,day02 -C语言 常量 变量 数据类型 进制转换 数据溢出...
常量 - 不会变化的数据 "hello" 'A' 10 3.14 #define PI 3.14 //采用宏定义的方法 定义一个常量 const int a = 10; 求圆的面积 ...
- java编程数据溢出问题_Java数据溢出代码详解
Java数据溢出代码详解 发布时间:2020-10-05 15:08:31 来源:脚本之家 阅读:103 作者:Pony小马 java是一门相对安全的语言,那么数据溢出时它是如何处理的呢? 看一段代码 ...
- mybatis 添加语句返回对象_mybatis的insert语句插入数据时的返回值的实现
mybatis的insert语句插入数据时的返回值的实现,语句,返回值,那条,都是,站长站 mybatis的insert语句插入数据时的返回值的实现 易采站长站,站长之家为您整理了mybatis的in ...
最新文章
- oracle 定时器时间分区_oracle分区表按时间自动创建
- 《Web前端开发精品课 HTML与CSS进阶教程》——1.4 id和class
- 11、MySQL算术运算符
- 如何查看Activity任务栈以及dumpsys_activity命令的简要使用及介绍
- spring boot整合shiro继承redis_spring-boot-plus集成Shiro+JWT权限管理
- a 标签中 rel=“noopener noreferrer“属性的含义和功能
- 论文写作思路_2018年的16个写作思路
- python googletrans_Python使用googletrans报错的解决方法
- “iQOO”怎么读?vivo官宣“发音”视频
- 使用Github发布自己的网站
- php怎么实现弹幕,HTML如何利用canvas实现弹幕功能
- Objective-C 学习笔记1 HelloWorld
- 系统学习数字图像处理之目标识别
- centos安装思源黑体
- VSTO简介及简单使用
- java实现学生、老师信息管理系统
- 导航上显示某个地点已关闭什么意思_大众MIB(275)教程之导航使用
- 多视图几何三维重建实战系列之COLMAP
- 建立一个被称为sroot()的函数,返回其参数的二次方根,重载sroot()三次,让它返回整数,长整数与双精度的二次方根
- python 小说下载工具_Python制作全网小说下载器