写点什么

C# 8 将为断言和自动化测试带来 Caller Expression Attribute

  • 2019-01-29
  • 本文字数:756 字

    阅读完需:约 2 分钟

C# 8将为断言和自动化测试带来Caller Expression Attribute

C#和其他的.NET 编程语言有一个叫作Caller Information Attribute的概念。在参数上应用这些属性时,开发人员就可以不负责提供匹配参数,把这些事情留给了编译器。目前,C#支持文件名或路径、行号以及调用方法或属性名的 Caller Information Attribute。根据“Caller Expression Attribute”提案,表达式也将支持 Caller Information Attribute。


考虑以下这对断言:


Assert.IsTrue(x - 7 > 0);Assert.IsTrue(y - 3 > 0);
复制代码


如果测试失败,很难确定是哪个断言被触发。你可以为每个断言提供一条消息,但这样做很枯燥乏味,而且很容易就过时,如果表达本身可以被捕获就好了。


public static void IsTrue(bool condition, [CallerArgumentExpression("condition")] string message = null);
复制代码


在这个示例中,如果开发人员未明确提供消息,那么编译器会将会使用 condition 参数对应的代码。本质上,编译器将代码转换为如下所示的形式:


Assert.IsTrue(x - 7 > 0, "x - 7 > 0");Assert.IsTrue(y - 3 > 0, "y - 3 > 0");
复制代码


根据提案的设计,这种捕获机制甚至可以被用在扩展方法上。


潜在的问题


这个设计存在三个问题。


如果提供的参数是 null 或者不是参数名的字符串,那么编译器将传入一个空字符串。

知道如何使用反编译器的人将能够通过反编译看到标有这个属性的方法的一些源代码。对于闭源软件来说,这可能是难以接受的。

虽然这不是功能本身的缺陷,但问题是现在存在一个只接受 bool 的 Debug.Assert API。即使重载方法的第二个参数使用了这个属性,并且是可选的,编译器仍然会选择非消息的那个参数。因此,非消息重载会被移除,这将造成二进制(尽管不是源代码)的突破性变更。


状态


目前,Caller Expression Attribute 被列在C# 8路线图中,状态为“Prototype”。


查看英文原文https://www.infoq.com/news/2019/01/Caller-Expression-Attribute


2019-01-29 08:004708
用户头像

发布了 731 篇内容, 共 459.8 次阅读, 收获喜欢 2004 次。

关注

评论

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

关于自己的一个梦(飞翔)

Yuchen

产品训练营 第三次作业

Wangyunnfei

使用pgBackRest并行归档解决wal堆积问题

PostgreSQLChina

数据库 postgresql 开源 开源社区

Kafka基础简介

架构精进之路

kafka 七日更 28天写作 2月春节不断更

极客时间产品训练营第三周作业

云随心

产品 作业 产品训练营

用RabbitMQ了好几年之后,我总结出来5点RabbitMQ的使用心得

四猿外

MQ RabbitMQ 消息队列

Idea工具的各种查找快捷键

小马哥

IntelliJ IDEA 七日更 2月春节不断更

华为18A架构师共享:Netty+Redis+zookeeper+高并发技术栈

996小迁

redis zookeeper 架构 Netty 高并发

官宣了!Apache ECharts 毕业成为 Apache 软件基金会顶级项目!

百度Geek说

百度 基金会

利用 Python 分析了某化妆品企业的销售情况,我得出的结论是?

JackTian

Python 数据分析 数据可视化 化妆品 2月春节不断更

2021年云计算面临的5大网络安全威胁

云计算 云安全

HTTPS是怎么保证数据安全传输的?

面试 HTTP

挖矿区块链_什么是挖矿 带你详细了解挖矿基础知识

v16629866266

说说常常被研发忽略的原型模式

后台技术汇

28天写作 2月春节不断更

即日起 Jira、Confluence 正式停售本地版,中国客户将无法购买

万事ONES

项目管理 开发者 研发管理 团队协作 CTO

数据库表数据量大读写缓慢如何优化(4)【分库分表】

我爱娃哈哈😍

数据库 架构

华为云FusionInsight助力宇宙行打造金融数据湖新标杆

华为云开发者联盟

数据湖 云原生 存储 FusionInsight 华为云

【mybatis】- MyBatis基础篇

双木之林

后疫情时代,企业如何实现数字化增长?

字节跳动 Kubernetes 容器 云原生

第三周产品经理训练营总结

产品经理训练营

《我想进大厂》之Zookeeper夺命连环9问

艾小仙

zookeeper

ICE暴雪正悄悄崛起

DT极客

玩转IDEA项目结构Project Structure,打Jar包、模块/依赖管理全搞定

YourBatman

Module IntelliJ IDEA Project Structure

即构自研海量有序数据网络MSDN,构建全球可靠的多云通讯链路

ZEGO即构

程序员成长第一篇:机会与趋势

石云升

28天写作 2月春节不断更 机会与趋势

anyRTC2020年 年终总结

anyRTC开发者

音视频 WebRTC RTC sdk

托管节点池助力用户构建稳定自愈的 Kubernetes 集群

阿里巴巴云原生

Docker 容器 运维 云原生 k8s

EXCEL数据如何去重? Python:这事我比你熟

智分析

Python

MySQL安装教程&问题解决

Mars

MySQL 运维

Linux-Lab 入门:使用开发板

贾献华

嵌入式 Linux Kenel 开发板 arm boot

SpringCloud 从入门到精通15---Sentinel搭建和服务监控

Felix

C# 8将为断言和自动化测试带来Caller Expression Attribute_语言 & 开发_Jonathan Allen_InfoQ精选文章