断言是一种非常常用的契约式编程的手段,自.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吧。

代码协定(三)——假定和断言相关推荐

  1. C#代码协定Contract静态类

    Contract 类 静态类Contract 参考文档:   代码协定Contract 命名空间: System.Diagnostics.Contracts 包含用于表示程序协定(如前置条件Preco ...

  2. c#Code Contracts代码协定

    Code Contracts的命名空间:System.Diagnostics.Contracts 集合1. 安装Code Contracts for .NET插件 Contracts.devlab9t ...

  3. 《C#高级编程》读书笔记(十四):代码协定

    一,代码协定 代码协定通常称作契约式编程,包括如下三个部分: 前置条件(precondiction):为了调用函数,必须为真的条件,在其违反时,函数决不调用,传递好数据是调用者的责任. 后置条件(po ...

  4. 关于Jenkins部署代码权限三种方案

    关于Jenkins部署代码权限三种方案 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.修改Jenkins进程用户为root [root@jenkins ~]# cat /etc ...

  5. ML之XGBoost:XGBoost参数调优的优秀外文翻译—《XGBoost中的参数调优完整指南(带python中的代码)》(三)

    ML之XGBoost:XGBoost参数调优的优秀外文翻译-<XGBoost中的参数调优完整指南(带python中的代码)>(三) 目录 3. 参数微调案例/Parameter Tunin ...

  6. 编写高性能的C#代码(三)使用SPAN

    原文来自互联网,由长沙DotNET技术社区编译.如译文侵犯您的署名权或版权,请联系小编,小编将在24小时内删除. 作者介绍: 史蒂夫·戈登(Steve Gordon)是Microsoft MVP,Pl ...

  7. Eclipse远程调试Java代码的三种方法

    Eclipse远程调试Java代码的三种方法, 第1种方法是用来调试已经启动的Java程序,Eclipse可以随时连接到远程Java程序进行调试, 第2种方法可以调试Java程序启动过程,但是Ecli ...

  8. VSCode调试代码的三种方式

    VSCode调试代码的三种方式 一.配置auto-attach(影响全局的终端) 在vscode的终端里运行node时,根据不同的选项,自动判断是否启动debug模式. ctrl + shift + ...

  9. 第一行代码-android-第三版-pdf扫描-思维导图-课件-源码

    第一行代码-android-第三版-pdf扫描-思维导图-课件-源码 一帮公众号各种要你关注, 各种压缩包层层套娃要密码, 还要进群, 真他妈日了gou了,找了半天 分享给大家, 毫无套路! pdf扫 ...

最新文章

  1. 【组队学习】【35期】动手学数据分析
  2. 将SQL中数据输出到Excel中
  3. java jpa 规范_Java:在JPA中使用规范模式
  4. 在BingoCC上面解析域名实现智能路由
  5. cordic ip核 vivado_vivado中Cordic IP核使用——计算正余弦(sin/cos)
  6. c语言 sizeof typeof,typeof、nameof、sizeof的用法
  7. 爬虫 知识点 总结。
  8. python html5 便利店收银系统_便利店收银系统使用教程
  9. 使有用计算机不注意卫生,“十种举措”,远离干眼
  10. 如何解除硬盘的磁盘写保护?
  11. 如何用c语言写上位机软件,上位机的工作原理_上位机编程用什么软件
  12. Android 解压 Zip 压缩文件
  13. 流氓软件卸载-MrWReSadse、Nexuser.exe、WRSvcmbdl.dll
  14. [转载]10大适合学英语的美剧 你看过几部_拔剑-浆糊的传说_新浪博客
  15. 打印机修复工具_Macbook无法开机?如何修复并使其重新启动
  16. 关于高清在线播放器:[迅播播放器][可使用javascript调用][完全兼容asp,jsp,php,.net等主流语言编写的程序]...
  17. 微信小程序开发天地图
  18. 个人制作的关于Oracle的PPT
  19. 《彩色方块对对碰 Android 版》(TetraVex) 经典休闲益智类游戏免费发布!
  20. python实现面部特效_python 实现波浪滤镜特效

热门文章

  1. 使用supervisor提高nodejs调试效率
  2. C# list 多条件排序
  3. Android_Kotlin原生开发_声明变量与内置数据类型---Kotlin工作笔记002
  4. 投标工作笔记001---竞标和围标
  5. 微服务升级_SpringCloud Alibaba工作笔记0004---认识spring gateway理解新一代网关
  6. 2015年4月7号的日志
  7. 成功在家用ssh远程连上了学校电脑虚拟机当中的ubuntu(代价是虚拟机全部黑屏只能用SSH连接了!)
  8. WSASocket()和socket()两个函数的区别
  9. sizeof运算符和size_t类型比较
  10. 学习GNU Make (1)(转)