手机
当前位置:查字典教程网 >编程开发 >C#教程 >使用checked语句防止数据溢出的解决方法
使用checked语句防止数据溢出的解决方法
摘要:在C#中有一个关键字checked,它用来判断当前上下文中的数值运算和数值转换是否会溢出。如是是常量溢出,那在编译时就能发现;如果是变量溢出...

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

数值运算有:++ — - (unary) + - * /

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

checked

checked 有两种使用方法:

1.作为操作符来使用

复制代码 代码如下:

int a = int.MinValue;

int c = checked(a--);

执行的时候会抛出异常:

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

2.检查一大块代码:

这样子会对里面所有的代码都做检查

复制代码 代码如下:

checked

{

int a = int.MinValue;

int c = a--;

}

如下图:

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

unchecked

和checked对应,还有一个unchecked关键字,用来取消检查。

也是两种使用;

1.作为运算符:

复制代码 代码如下:

int a = int.MinValue;

int c = unchecked(a--);

这样子就不会抛异常了

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

2.检查一大块代码

复制代码 代码如下:

unchecked

{

int a = int.MinValue;

int c = a--;

}

也不抛异常:

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

/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

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

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

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

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

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

几个注意

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;

}

}

执行不会抛异常:

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

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

【使用checked语句防止数据溢出的解决方法】相关文章:

C#中使用Socket获取网页源代码的代码

c# 获取数据库中所有表名称的方法

c#实现用SQL池,多线程定时批量执行SQL语句的方法

c#.net 常用函数和方法集

C#删除文件目录或文件的解决方法

C#连接Oracle数据库的实例方法

C# 获取打印机当前状态的方法

解析Silverlight调用WCF/Rest异常的解决方法

在Form_Load里面调用Focus无效的解决方法

使用SmtpClient发送邮件的方法

精品推荐
分类导航