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

所属分类: 软件编程 / C#教程 阅读数: 57
收藏 0 赞 0 分享
在C#中有一个关键字checked,它用来判断当前上下文中的数值运算和数值转换是否会溢出。如是是常量溢出,那在编译时就能发现;如果是变量溢出,那在运行时会抛出OverflowException。
数值运算有:++   —   - (unary)   +   -   *   /

有了这个就不用担心数据溢出了。

checked
checked 有两种使用方法:
1.作为操作符来使用
复制代码 代码如下:

int a = int.MinValue;
int c = checked(a--);

执行的时候会抛出异常:

image

2.检查一大块代码:
这样子会对里面所有的代码都做检查
复制代码 代码如下:

checked
{
    int a = int.MinValue;
    int c = a--;
}

如下图:

image

unchecked
和checked对应,还有一个unchecked关键字,用来取消检查。
也是两种使用;
1.作为运算符:

复制代码 代码如下:

int a = int.MinValue;
int c = unchecked(a--);

这样子就不会抛异常了

image

2.检查一大块代码

复制代码 代码如下:

unchecked
{
    int a = int.MinValue;
    int c = a--;
}

也不抛异常:

image

/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

image

2。点击“Build”,再点击“Advanced”

image

3。在打开的对话框中,把“Check for arithmetic overflow/underflow”打上勾

image

几个注意
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;
    }
}

执行不会抛异常:

image

3.为了性能考虑,建议Debug时做检查,Release时不做检查。

更多精彩内容其他人还在看

C#中Datetimepicker出现问题的解决方法

这篇文章主要给大家介绍了关于C#中Datetimepicker出现问题的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

C# SQLite数据库入门使用说明

这篇文章主要给大家介绍了关于C#中SQLite数据库入门使用的相关资料,文中通过图文以及示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

C#实现批量下载图片到本地示例代码

这篇文章主要给大家介绍了关于C#如何实现批量下载图片到本地的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用c#具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

如何获取C#中方法的执行时间以及其代码注入详解

这篇文章主要给大家介绍了关于如何获取C#中方法的执行时间以及其代码注入的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧
收藏 0 赞 0 分享

C#中通过LRU实现通用高效的超时连接探测

这篇文章主要介绍了c#中通过LRU实现通用高效的超时连接探测,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
收藏 0 赞 0 分享

如何使用C#将Tensorflow训练的.pb文件用在生产环境详解

这篇文章主要给大家介绍了关于如何使用C#将Tensorflow训练的.pb文件用在生产环境的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

C#程序启动项的设置方法

这篇文章主要为大家详细介绍了C#程序启动项的设置方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

c#爬虫爬取京东的商品信息

这篇文章主要给大家介绍了关于利用c#爬虫爬取京东商品信息的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们随着小编来一起学习学习吧
收藏 0 赞 0 分享

C#随机数生成字母金字塔

这篇文章主要为大家详细介绍了C#随机数生成字母金字塔,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

WPF实现窗体中的悬浮按钮

这篇文章主要为大家详细介绍了WPF实现窗体中的悬浮按钮,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享
查看更多