NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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

  • 2007-04-24
  • 本文字数:1017 字

    阅读完需:约 3 分钟

微软发布了 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-04-24 00:15735

评论

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

走进吉利|EMQ 映云科技助力车企“新四化”

EMQ映云科技

车联网 物联网 IoT emq iov

华为云开源的Karmada正式成为CNCF首个多云容器编排项目

华为云开发者联盟

容器 集群 cncf Karmada

恒源云(GpuShare)_快进来!这里有超高性价比的GPU资源

恒源云

深度学习

东软熙康、百度、京东方,互联网医院的三个典型样本

海比研究院

看动画学算法之:doublyLinkedList

程序那些事

数据结构 算法 看动画学算法 程序那些事

探究数字内容生产商机,把握未来内容生产脉搏

华为云开发者联盟

媒体 视频 华为云 数字内容 影视

国庆出游神器:魔幻黑科技换天造物,让vlog秒变科幻大片!

华为云开发者联盟

视频 modelarts 科幻 国庆 天空

Python代码阅读(第31篇):将一个列表分割成指定大小的小列表

Felix

Python 编程 Code Programing 阅读代码

博睿数据亮相北京IMC2021第三届中国智造CIO峰会

博睿数据

微信朋友圈 - 服务高性能复杂度分析

黑鹰

一文讲清楚FusionInsight MRS CDL如何使用

华为云开发者联盟

大数据 数据湖 FusionInsight MRS 集成 CDL

国家级|深信服再获CNCERT应急服务国家级支撑单位称号!

科技热闻

如何构建混合云管理平台?——资源管理篇

金蝶天燕云

云计算 云平台

目睹阿里技术官写的Tomcat架构笔记后,瞬间觉得自己是渣渣

Java 架构 面试 程序人生 编程语言

图谱相关技术在风控反作弊中的应用和探索

百度Geek说

后端 软件架构

关于Promise你需要知道的一切

devpoint

大前端 Promise 引航计划

堡垒机和虚拟机的两大区别分析-行云管家

行云管家

网络安全 虚拟机 服务器 堡垒机

等保二级需要测评吗?多久测评一次?

行云管家

网络安全 堡垒机 等保测评 过等保 二级等保

搞不懂云原生

二哥不再迷茫

恒拓高科亮相中国-东北亚博览会,赋能海内外企业构建数字化新生态

WorkPlus

阅读

大厂敲门砖!Alibaba技术官甩出的Springboot笔记

Java 架构 面试 程序人生 编程语言

一周信创舆情观察(9.13~9.26)

统小信uos

艾瑞发布《2021年中国企业级 SaaS 行业研究报告》,ONES 入选典型厂商案例

万事ONES

项目管理 SaaS 协同办公

从产业链、架构和技术三个层面,看元宇宙与RPA的发展关系

王吉伟频道

RPA 自动化 区块链+ 机器人流程自动化 元宇宙

快准狠!百万年薪的阿里架构师分享深入剖析Java虚拟机文档

Java 架构 面试 程序人生 编程语言

第 8 章 -《Linux 一学就会》-Centos8 软件包的管理与安装

学神来啦

Linux 运维

不得不聊一聊英语爱好者的单词杂货铺了

小匚

随笔杂谈 生活记录 英语 大学英语四六级 单词

使用 grpcurl 通过命令行访问 gRPC 服务

AlwaysBeta

golang gRPC

华为云带你探秘Xtrabackup备份原理和常见问题分析

华为云数据库小助手

GaussDB 华为云数据库 MySQL 数据库 GaussDB(for MySQL)

宇宙最强语言PHP的“全栈”框架——Laravel来了!

博文视点Broadview

金秋10月,日更挑战你准备好了么!?

InfoQ写作社区官方

热门活动 10月月更

微软新语言Spec#终结Null引用异常_.NET_Jonathan Allen_InfoQ精选文章