日期:2014-05-18  浏览次数:20833 次

c#默认不就是不检测溢出吗?还要uncheck干什么?
c#默认不就是不检测溢出吗?还要uncheck干什么?

------解决方案--------------------
1:在编译中可以调整为默认检测嘛;
2:我猜测一下

check
{

...这里很长

uncheck()
{
 ..这里很短或者确定不需要检测
}



}
这种情况也是有可能的只是我不知道这种代码它空间是否会检测,没测试过。
------解决方案--------------------
默认的运算符号+的IL指令是不检查溢出的 add指令
 
使用check以后,就会使用检查溢出的IL指令 addovf 好像是这样写,记的不太清楚了,其他几个操作符一样


------解决方案--------------------
正如你所说,C#默认是不检查溢出的,为什么需要这个关键字,我们可以探讨一下:
1.有uncheck关键字,没有check关键字,你不绝对别扭吗?这是成对出现的
2.如果一个程序多数地方需要检查溢出,我们可能在项目的属性的设置检查溢出(不是用check,是设置项目属性)
而在这个程序的极少数地方,我们不想检查溢出,那是不是就有了uncheck的用武之地呢?

------解决方案--------------------
编译器也可以设置为检验溢出
但其中一部分不想检验,就可以使用
------解决方案--------------------
一般的best practice建议debug build检查溢出,而release build不检查。这样在debug阶段你可以确定哪些溢出是不需要检查的,然后用unchecked段把这些代码圈起来。

应该说很多溢出都是有害的,所以尽可能要在debug阶段找出来解决掉。而之所以release build设为不检查,只是为了防止你的程序运行时影响到最终用户。因此请检查你的代码,处理所有你能够处理的溢出吧。

CLR via C#一书有相关的章节详细介绍这个。