【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

微软新语言 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:15733

评论

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

Redis学习之Redis概述及原理、基本操作及持久化

Linux服务器开发

redis 分布式 后端 中间件 Linux服务器开发

我是如何从设计师转到软件行业的? | 可怜巴巴的程序猿

Python研究所

随笔 话题讨论

正式发布!中国首个LF Edge捐赠项目Baetyl 2.2发布

百度开发者中心

物联网 开源技术

一周信创舆情观察(6.28~7.4)

统小信uos

用好“实时数据管理”助推器,旭辉集团加快数字化转型步伐

DataPipeline数见科技

大数据 数据融合 数据管理

Mobileye智慧出行再加码,中国市场生态建设取得新进展

E科讯

阿里P8手抄本惨遭泄露,并出现病毒式传播,致28人斩获大厂offer

Java架构师迁哥

Hightopo可视化入局“智慧工厂”,助力企业改革创新

一只数据鲸鱼

数据可视化 绿色工业 3D数据可视化 高炉炼铁 智慧工业

图的应用——拓扑排序

若尘

数据结构 拓扑排序

5分钟学会本地Pypi源搭建

Python研究所

Python

聊聊事务与分布式系统-从零讲到通透

刘绍

sql 分布式 事务 2PC XA

越学越有趣:『手把手带你学NLP』系列项目07 ——机器翻译的那些事儿

百度大脑

机器学习 nlp

再获权威认可!DataPipeline实时数据融合平台通过信通院大数据产品能力评测

DataPipeline数见科技

大数据 数据融合 数据管理

“用友 • 华为云杯”第三届企业云服务开发者大赛

ToB行业头条

开发者 低代码 用友

“京东商城”亿级高并发秒杀系统到底是怎么设计的?自己做该如何下手?

Java架构师迁哥

【架构实战营】第 7 模块作业

swordman

架构实战营

构筑智能制造时代“四重护城河”,联想中国开创产业新格局

科技大数据

2021年,BAT接连入局!“低代码”为何能备受资本追捧?

优秀

低代码

DataPipeline实时数据融合平台V3.0里程碑版发布!澎湃新动能

DataPipeline数见科技

大数据 数据融合 数据管理

一图读懂DataPipeline实时数据融合平台V3.0

DataPipeline数见科技

大数据 数据融合 数据管理

北鲲云超算平台——让科技更好地服务于用户

北鲲云

TDengine JDBC整合Druid

山石道人

涛思数据 tdengine Druid Spring MVC taos-jdbc

半年摸爬滚打,我是如何从小白进阶渗透测试工程师

网络安全学海

黑客 网络安全 信息安全 渗透测试 漏洞分析

云南智慧公安研判分析系统搭建,重点人员研判分析平台

接任务时一定要锁定需求啊!(转自小明同学)

BinTools图尔兹

数据库 dba 国产数据库 运维开发

32岁的我裸辞了,八年Java老鸟,只因薪水被应届生倒挂,在闭关三个月后拿到阿里Offer,定级P7!

Java架构师迁哥

爆款阿里P5到P7晋升之路,九大源码文档助我超神果然努力幸运并存

Java BAT

技术干货 | 录屏采集实现教程 —— Android端

ZEGO即构

大前端 音视频 录屏采集 Android端

免费分享JDBC与MyBatis的优秀图书

Java入门到架构

Java

2021百度云智峰会|DataPipeline携手百度赋能实时数据资产构建与应用

DataPipeline数见科技

大数据 数据融合 数据管理

MindSpore教程免费学,还有入门奖品

Geek_6cdeb6

人工智能 机器学习 深度学习 自我提升 羊毛

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