【AICon】AI 大模型超全落地场景&最佳实践 了解详情
写点什么

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

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

    阅读完需:约 3 分钟

8 月 16 - 19 日,与零一万物李开复、蔚来李斌、面壁智能李大海,及工商银行、交通银行、华夏银行等 100+ 行业专家相聚 FCon x AICon

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

评论

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

简单说明一下数据库审计能带来的价值

行云管家

数据库 数据安全 数据库审计

大规模异构数据的线索列表进化之路

百度Geek说

后端

上云采购季丨云服务器1核2G 低至35元/年,老用户续费6.5折起

阿里云弹性计算

阿里云 云服务器 ECS 采购季

2022年2月国产数据库大事记

墨天轮

数据库 opengauss TiDB 国产数据库 polarDB

3DCAT首届行业生态交流会|升大科技CEO邱杰:5G云渲染助力企业培训

3DCAT实时渲染

XR 云渲染 元宇宙 实时渲染

应对EAST 5.0新挑战!索信达推出灵矩全景式监管合规平台

索信达控股

数据治理 金融 监管平台 数智化 合规性

什么是云效?通过云效体验一站式研发,实现10 倍效能提升

阿里云云效

阿里云 DevOps 云原生 研发效能 云效

面向体验,助推超视频时代新增长

字节跳动视频云技术团队

音视频开发

大数据培训:Spark 性能调优详解

@零度

spark 大数据培训

web前端培训:2022前端基础面试题

@零度

CSS JavaScript 前端开发

大数据时代下,App数据隐私安全你真的了解么?

移动研发平台EMAS

阿里云 开发者工具 数据安全 #EMAS

Linux之ping命令

入门小站

Linux

2022年中国个人云盘行业发展年度分析

易观分析

个人云盘

如何在 Ubuntu 18.04 LTS 中配置 IP 地址?

Ethereal

在线HTML转PUG工具

入门小站

工具

深入浅出特征工程 -- 基于 OpenMLDB 的实践指南(下)

第四范式开发者社区

数据库 sql 人工智能「 特征 特征平台

无依赖单机尝鲜 Nebula Exchange 的 SST 导入

NebulaGraph

数据库 大数据 图数据库

虎符交易所产品再升级 正式全新上线AMM流动性池

区块链前沿News

虎符交易所 AMM

让体验可量化,火山引擎视频云2022新进阶

ToB行业头条

selenium相对定位器

红毛丹

3月程序媛福利 3月月更

为什么在数据驱动的路上,AB实验值得信赖?

字节跳动数据平台

字节跳动 数据分析 AB testing实战 ab测试

java培训:JVM的体系结构

@零度

JVM JAVA开发

语音顶会 ICASSP 2022 成果分享:基于时频感知域模型的单通道语音增强算法

阿里云视频云

阿里云 音频 论文 视频云 智能降噪

【C语言】野指针

謓泽

C语言 3月月更 野指针

当渲染遇上边缘计算,打造视频交互新模式

火山引擎边缘云

云原生 边缘计算 实时渲染

【等级保护】等级保护共分为几级?保护对象是指什么?

行云管家

网络安全 等保 等级保护 等保2.0

老牌软件厂商亚信科技加入,携手龙蜥社区共建开源生态

OpenAnolis小助手

开源 亚信科技 互联网社区

网络安全kali渗透学习 web渗透入门 Metasploit---基于tcp协议收集主机信息

学神来啦

网络安全 信息安全 kali kali Linux

Linux运维工程师必知的服务器备份工具:Rsnapshot!

Ethereal

iOS自动化测试驱动工具探索

字节跳动终端技术

ios 字节跳动 自动化测试 测试工具 火山引擎MARS

WorkPlus数据中台:企业降本增效新引擎

WorkPlus

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