-
C#教程之.使用checked语句防止数据溢出的解决方法
在C#中有一个关键字checked,它用来判断当前上下文中的数值运算和数值转换是否会溢出。如是是常量溢出,那在编译时就能发现;如果是变量溢出,那在运行时会抛出OverflowException。
数值运算有:++ — - (unary) + - * /
有了这个就不用担心数据溢出了。
checked
checked 有两种使用方法:
1.作为操作符来使用
int a = int.MinValue;
int c = checked(a--);
执行的时候会抛出异常:
这样子会对里面所有的代码都做检查
checked
{
int a = int.MinValue;
int c = a--;
}
如下图:
int a = int.MinValue;
int c = unchecked(a--);
这样子就不会抛异常了
unchecked
{
int a = int.MinValue;
int c = a--;
}
也不抛异常:
如果代码里总是要写这么多checked语句是不是很烦?如果能有一个编译参数就好,只有设置了就都会检查。微软也想到了这个,它提供了一个/checked 参数来做,也提供了一个/checked-来取消。
•溢出检查 /checked,也可以是/checked+
•溢出不检查 /checked-
当然,你想取消所有的检查也是可以的,命令行参数是/checked-
csc t2.cs /checked
其中csc是编译器csc.exe , t2.cs 是被编译的代码文件。
我想很多人是用Visual Studio吧。VS里也是可以设置的。
步骤如下,我以VS2010为例,(VS2005,2008差不多)
1。在工程上点右键,选择菜单Properties
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;
}
}
执行不会抛异常:
数值运算有:++ — - (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时不做检查。
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式