频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

微软新语言Spec#终结Null引用异常

来源:InfoQ 作者:Jonathan Allen/霍泰 出处:巧巧读书 2007-04-26 进入讨论组
  • 关 键 词:
  • java

微软发布了Spec# 1.0版本。Spec#是C#的一个扩展,支持许多契约(contract)属性,如非Null类型系统,前置和后置条件,循环常量(loop invariant)和对象常量等。

Null引用异常(reference exceptions)也许是C#、Java和VB程序中最普通不过的异常了。为了消除这种错误,Spec#支持一个非Null类型系统。在这个系统里,编译器确保用“!”符号标记的变量永不为Null,比如“Customer!_customer ”。为了便于使用,它允许成员变量在基类构造器(constructors)前就可以被初始化。

非Null类型系统还可以扩展到参数、本地变量和返回值。一个例外是数组中的值,因为可能会因数组初始化和C#的协变数组(covariant array)而导致错误。

前置条件指定对象或者在方法调用前被传递的参数等所需要的状态。比如,开发人员可以通过“requires”语句要求某个集合(collection)为不是只读的,或者要求在Insert方法调用前要用到的索引是有效的。不像现在在C#里面被用到的运行时异常(runtime exception),Spec#希望在编译时就能够设置这些条件。“otherwise”语句可以被用来表示哪些异常会被抛出,如果前置条件不能被静态检查和事后违背的话。

指定了ensures clause的后置条件会确保类的常量不被中断,返回的值也在一个可接受的范围。它会先于被调用的方法前存取对象值,所以开发人员也能确保类似数值变量可以一直以1为单位增长这样的事情。而且,还被编译器静态地保证。

类似于Java,Spec#也使用了可检查异常。主要的区别是,在一个发生异常的事件中也许仍可以设置后置条件。这种情况下,开发人员会将ensures clause置于throws clause之上,以确保所做的修改已经正确回滚。

其中没有提到的地方是Spec#是如何通过可检查异常(checked exception)处理版本标定(versioning)和继承(inheritance)。在Java中,如果说可能会跳出一个基类中没有定义的异常,那么一般很难去通过增加功能性或者子类来扩展类。

那些常量很像后置条件(post-condition),但是它们应用到类中所有的方法上。指定了“常量”声明,它们就可以保证在每个方法调用的最后,对象处在一个稳定的条件下。

Spec#严重依赖上面提到的契约类型。但是因为它们不是基础类库(Base Class Library)的一部分,所以Spec#允许预编译库的契约在一个编译时引用到的分离仓库(repository)中被指定。

请保留地址 http://www.qqread.com/news/y310365.html进入讨论组讨论。
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章