BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

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

| 作者 Jonathan Allen 关注 594 他的粉丝 ,译者 霍泰稳 关注 1 他的粉丝 发布于 2007年4月25日. 估计阅读时间: 3 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

微软发布了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)中被指定。

查阅英文原文:Spec# Puts an End to Null Reference Exceptions

编辑注:感谢孟岩岳立东对本文部分专业术语的审校。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT