在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语句防止数据溢出相关推荐

  1. access 一亿条数据_循环运算数据溢出

    本文讲解了循环运算时数据溢出的解决方法. 对于循环语句在运行过程中数据溢出,可以用下面一行代码搞定. DAO.DBEngine.SetOption dbMaxLocksPerFile, 9999999 ...

  2. c语言字节溢出,C语言变量定义与数据溢出(初学者)

    1.变量定义的一般形式为:类型说明符.变量名标识符等:例:int a,b,c;(abc为整型变量) 在书写变量定义时应注意以下几点: (1)允许在一个类型说明符后,定义多个相同类型的变量.各变量之间用 ...

  3. 使用SQL语句UPDATE数据,怎样知道是否UPDATE成功

    http://www.ixpub.net/thread-1252609-1-1.html 使用SQL语句UPDATE数据,怎样知道是否UPDATE成功 如题,我在RPG中使用SQL语句UPDATE数据 ...

  4. HQL语句中数据类型转换,及hibernate中createQuery执行hql报错

    一.HQL语句中数据类型转换: 我们需要从数据库中取出序号最大的记录,想到的方法就是使用order by子句进行排序(desc倒序),然后取出第一个对象,可是当初设计数据库时(我们是在原来的数据库的基 ...

  5. mysql sql测试_MySQL语句测试——数据查询

    MySQL语句测试--数据查询 3.4 数据查询 一.单表查询 /*1.选择表中的若干列,各个列的先后顺序和语句中列名从左到右的顺序一致 select 目标表达式 from 表名; */ /*(1)s ...

  6. oracle数据定义语句,oracle(sql)基础篇系列(3)——数据维护语句、数据定义语句、伪列...

    oracle(sql)基础篇系列(三)--数据维护语句.数据定义语句.伪列 DML语句 insert 向表中插入新的记录 --三种插入方式 --(1)不写字段的名字,直接按照字段的顺序把值逐个往里插 ...

  7. c语言变量名必须用小写 常量用大写,day02 -C语言 常量 变量 数据类型 进制转换 数据溢出...

    常量 - 不会变化的数据 "hello" 'A' 10 3.14 #define PI 3.14 //采用宏定义的方法 定义一个常量 const int a = 10; 求圆的面积 ...

  8. java编程数据溢出问题_Java数据溢出代码详解

    Java数据溢出代码详解 发布时间:2020-10-05 15:08:31 来源:脚本之家 阅读:103 作者:Pony小马 java是一门相对安全的语言,那么数据溢出时它是如何处理的呢? 看一段代码 ...

  9. mybatis 添加语句返回对象_mybatis的insert语句插入数据时的返回值的实现

    mybatis的insert语句插入数据时的返回值的实现,语句,返回值,那条,都是,站长站 mybatis的insert语句插入数据时的返回值的实现 易采站长站,站长之家为您整理了mybatis的in ...

最新文章

  1. oracle 定时器时间分区_oracle分区表按时间自动创建
  2. 《Web前端开发精品课 HTML与CSS进阶教程》——1.4 id和class
  3. 11、MySQL算术运算符
  4. 如何查看Activity任务栈以及dumpsys_activity命令的简要使用及介绍
  5. spring boot整合shiro继承redis_spring-boot-plus集成Shiro+JWT权限管理
  6. a 标签中 rel=“noopener noreferrer“属性的含义和功能
  7. 论文写作思路_2018年的16个写作思路
  8. python googletrans_Python使用googletrans报错的解决方法
  9. “iQOO”怎么读?vivo官宣“发音”视频
  10. 使用Github发布自己的网站
  11. php怎么实现弹幕,HTML如何利用canvas实现弹幕功能
  12. Objective-C 学习笔记1 HelloWorld
  13. 系统学习数字图像处理之目标识别
  14. centos安装思源黑体
  15. VSTO简介及简单使用
  16. java实现学生、老师信息管理系统
  17. 导航上显示某个地点已关闭什么意思_大众MIB(275)教程之导航使用
  18. 多视图几何三维重建实战系列之COLMAP
  19. 建立一个被称为sroot()的函数,返回其参数的二次方根,重载sroot()三次,让它返回整数,长整数与双精度的二次方根
  20. python 小说下载工具_Python制作全网小说下载器

热门文章

  1. C语言中含有阶乘的程序,c语言阶乘(c语言求10的阶乘的程序)
  2. 小学知识点~句式全覆盖专题
  3. win10系统没声音 服务器,win10系统音频驱动正常但是没有声音的解决方法
  4. 小米/手机,申请完整版root权限(红米5 plus 为例)
  5. mysql longblob 输出中文乱码
  6. IMU校正以及姿态融合
  7. 证券市场红周刊丨六大关键词回望金融科技关键之年,2020再出发!
  8. Canvas清除画布clearRect非常容易踩坑的点
  9. EasyNVR视频广场通道点击开始录像报错:录像任务已存在
  10. word文档转为PDF以及多种文档格式转换