c#美味:使用checked语句防止数据溢出
在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时不做检查。
参考资料
/checked (Check Integer Arithmetic)
http://msdn.microsoft.com/en-us/library/h25wtyxf(v=VS.71).aspx
Arithmetic Overflow Checking using checked/unchecked
http://www.codeproject.com/KB/cs/overflow_checking.aspx
C# 3.0 in a Nutshell, 3rd Edition
本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名和链接(http://greenerycn.cnblogs.com).
如果觉得文章有用,愿意的话赞助一杯饮料吧,谢谢。
![]() |
![]() |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述