写点什么

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

2007 年 4 月 24 日

微软发布了 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

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

2007 年 4 月 24 日 00:15370

评论

发布
暂无评论
发现更多内容

RabbitMQ消息体

云淡风轻

读书笔记 RabbitMQ

坚持ARTS(week-1)

王钰淇

ARTS 打卡计划

产品周刊 | 第 16 期(20200524)

Herbert

产品 设计 产品经理 产品设计

足不出户“逛”银行,37家城商行、农商行手机银行App性能大比拼

博睿数据

APM App 评测 网银 银行

微信gif图片大小的规则

石云升

微信 GIF

Spring Cloud 和 Dubbo 哪个会被淘汰?

程序猿DD

Spring Cloud dubbo

配置国内的pip源以提高使用pip安装python软件包的速度

良少

Python pip

从零到部署:用 Vue 和 Express 实现迷你全栈电商应用(二)

图雀社区

node.js vue.js Vue

企业微信机器人在大型财务共享中心的应用实践

DT极客

zookeeper到nacos的迁移实践

捉虫大师

架构 nacos

使用Spring Boot和Docker构建微服务架构(三)

MaxHu

Docker 架构 容器 微服务 Spring Boot

20200518-20200524朋友圈思考汇总

罗小布

日常思考

2020年3月云主机性能评测报告

博睿数据

云计算 运维 机房 数据中心 主机

理解这八大优势,才算精通单元测试

禅道项目管理

测试 单元测试

使用Spring Boot和Docker构建微服务架构(一)

MaxHu

Docker 架构 容器 微服务 Spring Boot

使用Spring Boot和Docker构建微服务架构(二)

MaxHu

Docker 架构 容器 微服务 Spring Boot

微软:正式发布针对 .NET Core的 Winform 设计器

Geek_Willie

.net 微软 Win .net core

游戏夜读 | 世界两大游戏评论!

game1night

思考:如何打造一个优秀的研发体系?

菜根老谭

研发管理 研发效能 研发体系

爬虫框架Scrapy应用实践-淘宝保险频道数据抓取【1】-前期准备

hadesxiong

Python 爬虫 保险 Scrapy

Jsp页面报错后如何找到提示信息中的_jsp.java文件

阡陌r

Java | @Override 不要再把它当成可有可无的了

YoungZY

Java 注解 Override annotation

玩转SpringBoot2.x之缓存对象

zhuoqianmingyue

redis springboot

2020年3月北京BGP机房网络质量评测报告

博睿数据

运维 APM 机房 数据中心 拨测

是什么在背后支撑起“带货一哥”李佳琦?

博睿数据

负载均衡 APM 压测 秒杀 并发

在线文档的开发难度与突破

Geek_Willie

分布式协同 SpreadJS 在线文档

ARTS第一周

困到清醒

ARTS 打卡计划 起跑

快速入门 Nacos 作为配置中心操作

zhuoqianmingyue

nacos SpringBoot 2

后台定时统计任务太耗时如何优化一下

zhuoqianmingyue

线程池

代码刚提交暂存区,组长突然要我把新增代码 Commit另一分支怎么办?

zhuoqianmingyue

git

使用Spring Boot和Docker构建微服务架构(四)

MaxHu

Docker 架构 容器 微服务 Spring Boot

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