写点什么

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

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

关注

评论

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

尚硅谷发布九章云台项目视频

小谷哥

下一朵云,会是谁

ToB行业头条

干货分享 | UE游戏鼠标双击判定

3DCAT实时渲染

游戏开发 虚幻引擎 ue 游戏开发引擎

真正的低代码平台

陈飞

PaaS SaaS 低代码平台

启科量子解决方案实践:使用QuTrunk+AWS Deep Learning AMI(TensorFlow2)构建量子神经网络

启科量子开发者官方号

人工智能 量子计算

设计模式-工厂方法模式和抽象工厂模式

C++后台开发

数据结构 设计模式 后端开发 Linux服务器开发 C++开发

前端技术培训学习哪个机构好?

小谷哥

前端报表如何实现无预览打印解决方案或静默打印

葡萄城技术团队

新书上市 | 以过去预测未来,有趣的时间序列

图灵社区

机器学习 统计学 时间序列 时间序列预测

Apache RocketMQ 入选 SegmentFault 年度中国技术品牌影响力企业榜单!

阿里巴巴云原生

阿里云 Apache RocketMQ

巧用Maya轴心操作小技巧,工作事半功倍!

3DCAT实时渲染

Maya,渲染 Autodesk Maya

前端线下面授培训机构的选择

小谷哥

化繁为简|中信建投基于StarRocks构建统一查询服务平台

StarRocks

数据库 大数据 开源

干货分享 | 3个Zbrush实用减面工具分享

3DCAT实时渲染

3D渲染 3D模型

浅谈 2022 前端工作流中全流程多层次的四款测试工具

Liam

前端 测试 前端开发 测试工具 测试开发

RocketMQ 监控告警:生产环境如何快速通过监控预警发现堆积、收发失败等问题?

阿里巴巴云原生

阿里云 RocketMQ 云原生

NFT铸造系统模式开发定制

开发微hkkf5566

单体应用、SOA、微服务,优劣势都有哪些?

FinFish

微服务 微服务架构 前端开发 移动开发 小程序化

新书上市 | 以过去预测未来,有趣的时间序列

图灵教育

机器学习 统计学 时间序列 时间序列预测

大数据培训学习怎么入门

小谷哥

基于流量双发平台的高效回归方案

网易云信

反垃圾 业务集群

上海前端培训学习的就业前景

小谷哥

速剖架构(一)-- 流量的自然走向

Dinfan

架构设计

《流浪地球2》“数字生命”最后一秒拯救人类,现实中AI也正在“长出”灵魂

硬科技星球

共攀元宇宙新高峰,2月14日沈阳元宇宙产业峰会邀您携手领跑2023

华为云开发者联盟

华为云 元宇宙 企业号 2 月 PK 榜 华为云开发者联盟 VR开发

利用混沌工程提高微服务的弹性

NGINX开源社区

nginx 微服务架构 性能 企业号 2 月 PK 榜

怎么正确使用 NPS ?用对了才事半功倍

鼎道智联

运营 用户体验 用户推荐

UE干货| UE虚幻引擎调试神器—控件反射器

3DCAT实时渲染

游戏开发 虚幻引擎 ue 游戏开发引擎

Go1.20新版本正式发布,新特性值得一看

王中阳Go

Go golang 高效工作 学习方法

程序员必备的数据库知识 2:Join 算法

NineData

数据库 程序员 join SQL sever NineData

点对点传输现状,镭速高速点对点传输解决方案

镭速

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