红帽白皮书新鲜出炉!点击获取,让你的云战略更胜一筹! 了解详情
写点什么

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:004566
用户头像

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

关注

评论

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

2022年8月中国数据库排行榜:openGauss重夺榜眼,PolarDB反超人大金仓

墨天轮

数据库 opengauss 国产数据库 polarDB gbase8a

leetcode 739. Daily Temperatures 每日温度(中等)

okokabcd

LeetCode 数据结构与算法 栈和队列

1W字详解线程本地存储 ThreadLocal

了不起的程序猿

Java JAVA开发 java程序员 java编程

等保2.0一个中心三重防护指的是什么?如何理解?

行云管家

等保 等级保护 等保2.0 安全等级保护

兆骑科创创业赛事活动发布平台,创业赛事,项目路演

兆骑科创凤阁

数据产品经理那点事儿 一

松子(李博源)

数据产品经理

易观分析联合中小银行联盟发布海南数字经济指数,敬请期待!

易观分析

金融 海南数字经济 易观分析

容器化 | 在 S3 实现定时备份

RadonDB

MySQL 数据库 Kubernetes

社区动态——恭喜海豚调度中国区用户组新晋 9 枚“社群管理员”

Apache DolphinScheduler

开源一夏 | POND:高效的 Python 通用对象池技术

Andy

Python 缓存 开源 算法 对象池

mysql进阶(三十三)MySQL数据表添加字段

No Silver Bullet

MySQL 8月月更 添加字段

fastposter v2.9.1 程序员必备海报生成器

物有本末

海报生成器 海报编辑器 图片生成 二维码生成

在本地利用虚拟机快速搭建一个小型Hadoop大数据平台

Jack20

云计算 大数据

头脑风暴:目标和

HelloWorld杰少

数据结构 算法 LeetCode 8月月更

避免 10 大 NGINX 配置错误(上)

NGINX开源社区

nginx 架构 配置 配置分析 故障排除

“68道 Redis+168道 MySQL”精品面试题(带解析)

冉然学Java

Java MySQL redis 编程 程序员

2022年中国软饮料市场洞察

易观分析

软饮料 市场分析

MySQL 原理与优化:Update 优化

老崔说架构

兆骑科创高层次人才创业大赛平台,投融资对接,双创服务

兆骑科创凤阁

易观千帆银行用户体验中心:聚焦银行APP用户体验

易观分析

金融 银行 用户体验

智为链接,慧享生活,荣耀智慧服务,只为 “懂” 你

荣耀开发者服务平台

开发者 安卓 荣耀 honor

借数据智能,亚马逊云科技助力企业打造品牌内生增长力

Lily

缺少比较器,运放来救场!(运放当做比较器电路记录)

矜辰所致

电路设计 8月月更 比较器 运放

用好 DIV 和 API,在前端系统中轻松嵌入数据分析模块

葡萄城技术团队

前端 嵌入式 BI 可视化数据

漏洞管理计划的未来趋势

SEAL安全

安全漏洞 企业安全 企业it安全 软件供应链安全 漏洞管理

NFT数字藏品——数字藏品发行平台开发

开源直播系统源码

软件开发 数字藏品 数字藏品系统软件开发

海外邮件发送指南(二)

极光JIGUANG

消息推送 邮件

友邦人寿可观测体系设计与落地

阿里巴巴云原生

阿里云 云原生 可观测 合作案例 友邦人寿

网络安全——XSS之被我们忽视的Cookie

Jack20

网络安全

万物互联,车联网数字化需要快速引入小程序生态

Speedoooo

小程序 车联网 IoT 小程序生态

符合信创要求的堡垒机有哪些?支持哪些系统?

行云管家

信创 堡垒机 信创产业

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