源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

使用checked语句防止数据溢出的解决方法

  • 时间:2020-11-08 18:55 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:使用checked语句防止数据溢出的解决方法
在C#中有一个关键字checked,它用来判断当前上下文中的数值运算和数值转换是否会溢出。如是是常量溢出,那在编译时就能发现;如果是变量溢出,那在运行时会抛出OverflowException。 数值运算有:++   —   - (unary)   +   -   *   / 有了这个就不用担心数据溢出了。 [b]checked [/b]checked 有两种使用方法: 1.作为操作符来使用
[u]复制代码[/u] 代码如下:
int a = int.MinValue; int c = checked(a--);
执行的时候会抛出异常: [img]http://files.jb51.net/file_images/article/201305/201305180921264.png[/img] 2.检查一大块代码: 这样子会对里面所有的代码都做检查
[u]复制代码[/u] 代码如下:
checked {     int a = int.MinValue;     int c = a--; }
如下图: [img]http://files.jb51.net/file_images/article/201305/201305180921265.png[/img] [b]unchecked [/b]和checked对应,还有一个unchecked关键字,用来取消检查。 也是两种使用; 1.作为运算符:
[u]复制代码[/u] 代码如下:
int a = int.MinValue; int c = unchecked(a--);
这样子就不会抛异常了 [img]http://files.jb51.net/file_images/article/201305/201305180921266.png[/img] 2.检查一大块代码
[u]复制代码[/u] 代码如下:
unchecked {     int a = int.MinValue;     int c = a--; }
也不抛异常: [img]http://files.jb51.net/file_images/article/201305/201305180921267.png[/img] [b]/checked 和/checked- [/b]如果代码里总是要写这么多checked语句是不是很烦?如果能有一个编译参数就好,只有设置了就都会检查。微软也想到了这个,它提供了一个/checked 参数来做,也提供了一个/checked-来取消。 •溢出检查 /checked,也可以是/checked+ •溢出不检查 /checked- 当然,你想取消所有的检查也是可以的,命令行参数是/checked-
[u]复制代码[/u] 代码如下:
csc t2.cs /checked
其中csc是编译器csc.exe , t2.cs 是被编译的代码文件。 我想很多人是用Visual Studio吧。VS里也是可以设置的。 步骤如下,我以VS2010为例,(VS2005,2008差不多) 1。在工程上点右键,选择菜单Properties [img]http://files.jb51.net/file_images/article/201305/201305180921268.png[/img] 2。点击“Build”,再点击“Advanced” [img]http://files.jb51.net/file_images/article/201305/201305180921269.png[/img] 3。在打开的对话框中,把“Check for arithmetic overflow/underflow”打上勾 [img]http://files.jb51.net/file_images/article/201305/2013051809212610.png[/img] [b]几个注意 [/b]1.checked语句只对当前上下文中的代码有效,即不对调用的函数内部做检查。
[u]复制代码[/u] 代码如下:
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关键字不检查左移和右移是否溢出。
[u]复制代码[/u] 代码如下:
static void Main(string[] args) {     checked     {         int a = int.MinValue;         int c = a>>1;     } }
执行不会抛异常: [img]http://files.jb51.net/file_images/article/201305/2013051809212611.png[/img] 3.为了性能考虑,建议Debug时做检查,Release时不做检查。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部