[转]代码协定

代码协定提供一种使用代码指定前置条件、后置条件和对象固定条件的方式。 前置条件是在输入方法或属性时必须满足的要求。 后置条件描述方法或属性代码退出时的预期。 对象固定条件描述正常状态下的类的预期状态。

代码协定包含用于标记代码的类、用于编译时分析的静态分析器和运行时分析器。 代码协定的类可在 System.Diagnostics.Contracts 命名空间中找到。

代码协定的优点包括:

  • 改进测试:代码协定提供静态协定验证、运行时检查和文档生成。
  • 自动测试工具:可以使用代码协定来筛选掉不满足前置条件的没有意义的测试参数,从而生成更有意义的单元测试。
  • 静态验证:静态检查器可以在不运行程序的情况下确定是否存在任何违反协定的情况。 它会检查隐式协定(如 null 取消引用和数组绑定)和显式协定。
  • 引用文档:文档生成器在现有的 XML 文档文件增加协定信息。 还提供了可与 Sandcastle 一起使用的样式表,以便生成的文档页具有协定节。

所有 .NET Framework 语言都可以立即使用协定;您不必编写特殊的分析器或编译器。 利用 Visual Studio 外接程序,您可以指定要执行的代码协定分析的级别。 分析器可以确认协定的格式正确(执行类型检查和名称解析),并且可以使用 Microsoft 中间语言 (MSIL) 格式生成编译格式的协定。 通过在 Visual Studio 中创作协定,您可以利用该工具提供的标准 IntelliSense。

协定类中的大多数方法都是在一定条件下编译的;也就是说,只有在使用 #define 指令定义特殊符号 CONTRACTS FULL 时,编译器才会发出对这些方法的调用。 可以利用 CONTRACTS FULL 通过代码编写协定,而不必使用 #ifdef 指令;可以产生不同的生成,有些生成包含协定,有些不包含协定。

有关使用代码协定的详细说明和工具,请参见 MSDN DevLabs 网站上的e Code Contracts

Preconditions

可以使用 Contract.Requires 方法来表示前置条件。 前置条件指定调用方法时的状态。 它们通常用于指定有效的参数值。 前置条件中提到的所有成员必须至少具有与方法本身相同的可访问性;否则,前置条件可能不会被方法的所有调用方所理解。 该条件不得有任何负面影响。 失败的前置条件的运行时行为由运行时分析器确定。

例如,下面的前置条件表示参数 x 必须不为 null。

Contract.Requires( x != null );

如果代码必须在前置条件失败时引发特定的异常,则可以使用 Requires 的泛型重载,如下所示。

Contract.Requires<ArgumentNullException>( x != null, "x" );

旧式 Requires 语句

大多数代码都以 if-then-throw 代码的形式包含一些参数验证。 在以下情况下,协定工具将这些语句识别为前置条件:

当 if-then-throw 语句以这种形式出现时,则工具将这些语句识别为旧的 requires 语句。 如果 if-then-throw 序列后面没有跟任何其他协定,则代码以 Contract.EndContractBlock 方法结尾。

if ( x == null ) throw new ...
Contract.EndContractBlock(); // All previous "if" checks are preconditions

请注意,以上测试中的条件是否定的前置条件。(实际的前置条件应是 x != null。)否定的前置条件严格受限:它必须如以上示例所示那样编写;也就是说,它不应包含 else 子句,并且 then 子句体必须是单个 throw 语句。 if 测试受纯正性和可见性规则的限制(请参见使用准则),而 throw 表达式只受纯正性规则的限制。 但是,引发的异常类型必须与包含协定的方法具有相同的可见性。

Postconditions

后置条件是针对方法终止时的状态的协定。 在即将退出方法之前检查后置条件。 失败的后置条件的运行时行为由运行时分析器确定。

与前置条件不同,后置条件可以引用可见性更低的成员。 客户端可能无法理解或利用后置条件使用私有状态表示的某些信息,但这不会影响客户端正确使用方法的能力。

标准后置条件

可以使用 Ensures 方法来表示标准后置条件。 后置条件表示在方法正常终止时必须为 true 的条件。

Contract.Ensures( this .F > 0 );

异常后置条件

异常后置条件是在方法引发特定异常时应为 true 的后置条件。 可以使用 Contract.EnsuresOnThrow 方法来指定这些后置条件,如以下示例所示。

Contract.EnsuresOnThrow<T>( this.F > 0 );

该参数是每当引发作为 T 子类型的异常时必须为 true 的条件。

有些异常类型很难在异常后置条件中使用。 例如,使用 T 的类型 Exception 要求方法保证条件,而不考虑所引发的异常类型,即使异常类型为堆栈溢出或其他无法控制的异常。 应只将异常后置条件用于当调用成员时可能会引发的特定异常,例如,调用 TimeZoneInfo 方法时引发 InvalidTimeZoneException

时间: 2024-11-15 00:23:12

[转]代码协定的相关文章

【C#进阶系列】19 异常和状态管理

异常就是指成员没有完成它的名称所宣示的行动. public class Girl { public string Name { get; set; } } public class Troy{ Girl girl; public void Love() { Console.WriteLine("Troy爱上了" + girl.Name); } } 上面这段代码会有异常,因为Troy去执行Love这个函数,然而其中girl根本就没有赋值.本来Troy预期完成爱一个姑娘这个行动,结果发生了

【读书笔记】C#高级编程 第二十章 诊断

(一)诊断概述 名称空间System.Diagnostics提供了用于跟踪.事件日志.性能测量以及代码协定的类.System.Diagnostics.Contracts名称空间中的类可以定义前提条件.后置条件和常量,它们不仅可以在运行期间检查,还可以使用静态的协定分析器检查. (二)代码协定 前置条件列出了参数必须满足的要求,后置条件定义了返回数据必须满足的要求,常量定义了方法中变量必须满足的要求. (三)跟踪 参考:http://962410314.blog.51cto.com/7563109

结对编程项目总结以及一些小小的体会

结对项目:电梯调度算法的实现和测试 12061205 王力民   12061196 金鑫 这就是我们两个忙着编代码的样子啦,之前也没有尝试过这样一种结对编程的方式,第一次这样合作,还是有不少感想与收获的吧. 一.关于结对编程的优缺点 优点: 1. 在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作能有更强的解决问题的能力. 2. 对开发人员自身来说,结对工作能带来更多的信心,高质量的产出能带来更高的满足感,同时,能够降低学习成本,一边编程,一边共享知识和经验,有效地在实践中进行学习.

C++ 11 创建和使用 shared_ptr

shared_ptr 的类型是C + +标准库中一个聪明的指针,是为多个拥有者管理内存中对象的生命周期而设计的.在你初始化一个 shared_ptr 后,你可以复制它,把函数参数的值递给它,并把它分配给其它 shared_ptr 实例.所有实例指向同一个对象,并共享访问一个“控制块”,即每当一个新的shared_ptr 被添加时,递增和递减引用计数,超出范围,则复位.当引用计数到达零时,控制块删除内存资源和自身. 下图显示了指向一个内存位置的几个 shared_ptr 实例. 无论什么时候,当内

【C#版本详情回顾】C#4.0主要功能列表

诊断和性能 从 .NET Framework 4 开始,您可以获得每个应用程序域的处理器使用情况和内存使用情况估计值 通过托管承载 API.本机承载 API 以及 Windows 事件跟踪 (ETW),可提供应用程序域资源监控 参见新增的 AppDomain.MonitoringIsEnabled 属性 垃圾回收 .NET Framework 4 提供背景垃圾回收替代了以前版本中的并发垃圾回收并提高了性能 代码协定 代码协定允许您指定方法或类型的签名没有单独表示的协定信息 以前置条件.后置条件和

引用计数智能指针

<a>C++ <span style="font-family:宋体;">智能指针具体解释</span></a> 一.简单介绍 因为 C++ 语言没有自己主动内存回收机制.程序猿每次 new 出来的内存都要手动 delete. 程序猿忘记 delete.流程太复杂.终于导致没有 delete.异常导致程序过早退出,没有运行 delete 的情况并不罕见. 用智能指针便能够有效缓解这类问题,本文主要解说參见的智能指针的使用方法.包含:std

核心编程

一.代码协定 1.前提条件 Contract.Requires(bool) .EndContractBlock();用于兼容旧if判断代码 2.后置条件 .Ensures(bool) .Result<type>() 返回值 .OldValue<type>(x)返回参数的原始值 .ValueAtResult(out x)返回out参数的值 3.集合检查 .Exists()任一项满足条件 .ForAll()所有项满足条件 4.恒等式条件 .Invariant(bool) 5.接口绑定协

C#学习笔记 ----检测

System.Diagnostics 代码协定 .NET 4在System.Diagnostics.Contracts名称空间中包含的类可用于静态检查代码和在运行期间检查代码,这些类可由所有的.NET语言使用. 利用这个功能可以定义方法中的前提条件.后置条件和常量. 前提条件检查传递给方法的参数.Requires()和Rquires<TException>()方法是可以用Contract类定义的前提条件 后置条件定义了方法执行完后共享数据和返回值的保证.Ensure()和EnsuresOnTh

对.net技术组件的分析和选择

.net很庞杂,学习最忌讳什么?为了学而学,而不是为了用而学.我们不是为了成为教师,所以不要成为书呆子,不要成为"博士",要从庞杂的技术群中选择自己需要的内容进行学习. 如果不加选择,一股脑的去学,这种"参考书式"学习接触一堆信息,不假思索,结果只会培养一个万事知晓,却不擅长运用的人.要思考技术的构成,想想怎么运用组合,将零散的技术有机构成一个整体,这样才是有目的,为运用而学. 首先是语法类的技术要点分析.众所周知,算法+数据结构=程序,这个公式是最基础的概念,但是