写点什么

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

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

关注

评论

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

一文搞懂Go1.18泛型新特性

闫同学

Go 11月月更

Java反射(完)类加载和反射获取信息

浅辄

Java 反射 11月月更

知乎好物推荐文能不能赚钱:如何撰写好物推荐文

石头IT视角

聊聊如何让办公网络直连Kubernetes集群PodIP/ClusterIP/Service DNS等

大卡尔

#Kubernetes# 工程效能 11月月更

java并发编程挑战与原理剖析

想要飞的猪

synchronized volatile原理

融云推送服务:独享推送通道,更高并发能力,应用运营必备

融云 RongCloud

互联网 消息

从React源码来学hooks是不是更香呢

goClient1992

React

【愚公系列】2022年11月 微信小程序-页面生命周期

愚公搬代码

11月月更

聊聊Mybatis的反射之ObjectWrapper

急需上岸的小谢

11月月更

Alien Skin Exposure2023独立编辑器和PS/LR插件

茶色酒

Alien Skin Exposure

API关键技术——身份认证

阿泽🧸

11月月更 API安全

从React源码角度看useCallback,useMemo,useContext

goClient1992

React

Spring事务的底层原理

千锋IT教育

浅谈Go语言反射

闫同学

Go 反射 11月月更

聊聊mybatis的反射之Invoker模块

急需上岸的小谢

11月月更

性能测试知识科普(五):能力分层

老张

性能测试 岗位模型

【web 开发基础】PHP 自定义常规函数的声明及应用 (30)

迷彩

函数 PHP基础 11月月更 自定义函数 常规参数函数

支持向量机-线性SVM用于分类的原理

烧灯续昼2002

Python 机器学习 算法 sklearn 11月月更

CleanMyMac X2023苹果电脑系统清理维护软件

茶色酒

CleanMyMac X2023

C++学习---类型萃取---std::integral_constant

桑榆

C++ STL 11月月更

聊聊mybatis的反射之对象工厂

急需上岸的小谢

11月月更

什么是容器编排及编排的优点

穿过生命散发芬芳

容器编排 11月月更

极客时间运维进阶训练营第四周作业

Starry

从 Redux 的困扰到如何技术选型

光毅

JavaScript React Redux

从React源码分析看useEffect

goClient1992

React

react源码分析:babel如何解析jsx

flyzz177

React

【Node.JS】写入文件内容

坚毅的小解同志

node.js 11月月更

融云 IM 和 RTC 服务,「助攻」智能物流等客户打通链路、完善生态

融云 RongCloud

IM RTC

2022-11-22:小美将要期中考试,有n道题,对于第i道题, 小美有pi的几率做对,获得ai的分值,还有(1-pi)的概率做错,得0分。 小美总分是每道题获得的分数。 小美不甘于此,决定突击复习,

福大大架构师每日一题

算法 rust 福大大

Hive 与 HBase 之间的区别和联系

千锋IT教育

react源码分析:实现react时间分片

flyzz177

React

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