当前位置:  编程技术>.net/c#/asp.net

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

    来源: 互联网  发布时间:2014-10-20

    本文导语:  在C#中有一个关键字checked,它用来判断当前上下文中的数值运算和数值转换是否会溢出。如是是常量溢出,那在编译时就能发现;如果是变量溢出,那在运行时会抛出OverflowException。数值运算有:++   —   - (unary)   +   -  ...

在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时不做检查。


    
 
 

您可能感兴趣的文章:

  • oracle数据库删除数据Delete语句和Truncate语句的使用比较
  • c#入门之分支语句使用方法(三元运算符、if语句、switch语句)
  • UNIX/LINUX 在case语句里使用?
  • 编写so时,使用了“打开设备语句”。
  • java switch语句使用注意的四大细节
  • 怎样使jbuilder7能使用import javax.servlet.http.*;语句?
  • Oracle中SQL语句连接字符串的符号使用介绍
  • 关于java中执行sql语句使用order by的问题!
  • JAVA基础 语句标签的合法使用,以及{}语句块到底有什么用?
  • 使用php语句将数据库*.sql文件导入数据库
  • 将oracle的create语句更改为alter语句使用
  • Python pass 语句使用示例
  • 简单问题! java中可以使用类似于 X + =10;的语句?
  • 请问如何在Javascript中使用JSP语句?
  • MSSQL 检查所使用的语句是否符合标准
  • 使用JDBC连接数据库时Class.forName()语句的使用疑问
  • Java得到一个整数的绝对值,不使用任何判断和比较语句,包括API
  • 如何使用UNIX语句来实现这个功能? 高手来看下
  • C#使用带like的sql语句时防sql注入的方法
  • MySQL与MSSQl使用While语句循环生成测试数据的代码
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 如何使用bash来防止一个程序死掉?
  • 使用TSL命令实现进程同步和互斥来防止竞争条件!
  • 使用VS2005自带的混淆器防止你的程序被反编译的方法
  • Python中使用urllib2防止302跳转的代码例子
  • 防止jQuery ajax Load使用缓存的方法小结
  • php伪造referer 使用referer防止图片盗链
  • 使用php伪造referer的方法 利用referer防止图片盗链
  • Jsp可否使用带有GUI的JavaBean,如何使用? iis7站长之家
  • 在测试memset函数的执行效率时,分为使用Cash和不使用Cash辆种方式,该如何控制是否使用缓存?
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 求ibm6000的中文使用手册 !从来没用过服务器,现在急需使用它,不知如何使用! 急!!!!!
  • Python不使用print而直接输出二进制字符串
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • Office 2010 Module模式下使用VBA Addressof
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • c#中SAPI使用总结——SpVoice的使用方法
  • tcmalloc内存泄露优化c++开源库下载,安装及使用介绍
  • 使用了QWidget的程序,如何使用后台程序启动它?
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • 共享内存一般是怎么使用的,是同消息队列配合使用么
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • Jsp可否使用带有GUI的JavaBean,如何使用?
  • c/c++预处理命令预#,##使用介绍
  • asp程序使用的access在Linux下如何使用!
  • 在div中使用css让文字底部对齐的方法
  • 新装的Linux使用root用户不能使用FTP?
  • Python namedtuple(命名元组)使用实例
  • LINUX下使用Eclipse,如何使用交叉编译器?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3