代码协定(三)——假定和断言
断言是一种非常常用的契约式编程的手段,自.Net 1.0起就内置了对断言的支持,使用方式如下:
Debug.Assert(offset == 10);
在Code Contract中,也提供了对断言的支持,不过将其进一步细化了为假定和断言两种API:
Contract.Assert(offset == 10);
Contract.Assume(offset == 10);
这两种API的使用方式和功能大体上Debug.Assert和非常类似,从API上基本上看不出来它们的分别。实际上,他们的区别主要是在于对静态代码分析(在后面的文章中介绍)的条件上,Contract.Assert上比Contract.Assume更加严格。例如,对于如下函数:
public static int CalculateSomeValues()
{
return 1;
}
static void Main(string[] args)
{
int x = CalculateSomeValues();
Contract.Assert(x > 0);
}
开启了静态检查后,会发现Contract.Assert会报告警:(用Contract.Assume则没有这个告警)
这个告警的意思是无法保证CalculateSomeValues函数返回值大于0,要消除这个告警,则需要在CalculateSomeValues函数里加一个后置条件约定:
public static int CalculateSomeValues()
{
Contract.Ensures(Contract.Result<int>() >0);
return 1;
}
不过,这也是一个非常苛刻的检查了,只有把静态检查开关开得很大才会出现这个告警,大多数的情形下是不会有这个告警的。可能微软也觉得严格执行全流程约定反而会使代码协定成为负担,有些舍本逐末了。也就是说,大部分的时候,这两个API并没有什么大的区别。
另外,微软官方给Contract.Assume定义了一个快捷键"cam",并没有找到Contract.Assert。可能微软官方貌似也是推荐使用Contract.Assume吧。
代码协定(三)——假定和断言相关推荐
- C#代码协定Contract静态类
Contract 类 静态类Contract 参考文档: 代码协定Contract 命名空间: System.Diagnostics.Contracts 包含用于表示程序协定(如前置条件Preco ...
- c#Code Contracts代码协定
Code Contracts的命名空间:System.Diagnostics.Contracts 集合1. 安装Code Contracts for .NET插件 Contracts.devlab9t ...
- 《C#高级编程》读书笔记(十四):代码协定
一,代码协定 代码协定通常称作契约式编程,包括如下三个部分: 前置条件(precondiction):为了调用函数,必须为真的条件,在其违反时,函数决不调用,传递好数据是调用者的责任. 后置条件(po ...
- 关于Jenkins部署代码权限三种方案
关于Jenkins部署代码权限三种方案 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.修改Jenkins进程用户为root [root@jenkins ~]# cat /etc ...
- ML之XGBoost:XGBoost参数调优的优秀外文翻译—《XGBoost中的参数调优完整指南(带python中的代码)》(三)
ML之XGBoost:XGBoost参数调优的优秀外文翻译-<XGBoost中的参数调优完整指南(带python中的代码)>(三) 目录 3. 参数微调案例/Parameter Tunin ...
- 编写高性能的C#代码(三)使用SPAN
原文来自互联网,由长沙DotNET技术社区编译.如译文侵犯您的署名权或版权,请联系小编,小编将在24小时内删除. 作者介绍: 史蒂夫·戈登(Steve Gordon)是Microsoft MVP,Pl ...
- Eclipse远程调试Java代码的三种方法
Eclipse远程调试Java代码的三种方法, 第1种方法是用来调试已经启动的Java程序,Eclipse可以随时连接到远程Java程序进行调试, 第2种方法可以调试Java程序启动过程,但是Ecli ...
- VSCode调试代码的三种方式
VSCode调试代码的三种方式 一.配置auto-attach(影响全局的终端) 在vscode的终端里运行node时,根据不同的选项,自动判断是否启动debug模式. ctrl + shift + ...
- 第一行代码-android-第三版-pdf扫描-思维导图-课件-源码
第一行代码-android-第三版-pdf扫描-思维导图-课件-源码 一帮公众号各种要你关注, 各种压缩包层层套娃要密码, 还要进群, 真他妈日了gou了,找了半天 分享给大家, 毫无套路! pdf扫 ...
最新文章
- 【组队学习】【35期】动手学数据分析
- 将SQL中数据输出到Excel中
- java jpa 规范_Java:在JPA中使用规范模式
- 在BingoCC上面解析域名实现智能路由
- cordic ip核 vivado_vivado中Cordic IP核使用——计算正余弦(sin/cos)
- c语言 sizeof typeof,typeof、nameof、sizeof的用法
- 爬虫 知识点 总结。
- python html5 便利店收银系统_便利店收银系统使用教程
- 使有用计算机不注意卫生,“十种举措”,远离干眼
- 如何解除硬盘的磁盘写保护?
- 如何用c语言写上位机软件,上位机的工作原理_上位机编程用什么软件
- Android 解压 Zip 压缩文件
- 流氓软件卸载-MrWReSadse、Nexuser.exe、WRSvcmbdl.dll
- [转载]10大适合学英语的美剧 你看过几部_拔剑-浆糊的传说_新浪博客
- 打印机修复工具_Macbook无法开机?如何修复并使其重新启动
- 关于高清在线播放器:[迅播播放器][可使用javascript调用][完全兼容asp,jsp,php,.net等主流语言编写的程序]...
- 微信小程序开发天地图
- 个人制作的关于Oracle的PPT
- 《彩色方块对对碰 Android 版》(TetraVex) 经典休闲益智类游戏免费发布!
- python实现面部特效_python 实现波浪滤镜特效
热门文章
- 使用supervisor提高nodejs调试效率
- C# list 多条件排序
- Android_Kotlin原生开发_声明变量与内置数据类型---Kotlin工作笔记002
- 投标工作笔记001---竞标和围标
- 微服务升级_SpringCloud Alibaba工作笔记0004---认识spring gateway理解新一代网关
- 2015年4月7号的日志
- 成功在家用ssh远程连上了学校电脑虚拟机当中的ubuntu(代价是虚拟机全部黑屏只能用SSH连接了!)
- WSASocket()和socket()两个函数的区别
- sizeof运算符和size_t类型比较
- 学习GNU Make (1)(转)