调用者参数表达式 - 查看C#10中的新语言功能
欢迎来到我们系列的第二部分,在这里我们将仔细看看新的c#语言特性.NET团队已实施,Resharper和Rider如何让您在Codebase中轻松采用它们。欢迎使用c# 10和。net 6!
在这个系列中,我们正在寻找:
- File-Scoped名称空间
- 来电者参数表达式
- 全球Usings
- 插入字符串的改进
- λ的改进
- ......更多宣布
在这篇文章中,我们将讨论调用者参数表达式的所有相关方面,以及它们在哪里有帮助。玩得开心,很惊讶!
来电者参数表达式
新的CallerArgumentExpressionAttribute
将现有属性族连接到确定调用者信息,如成员名称或文件路径,而不使用反射。然后可以用于提供有关错误原点的更好信息。新属性允许捕捉表达式作为一个简单的字符串传递给参数:
公共静态void main(string [] args){//您所说的断言(args.length!= 1);//被编译的断言(args.length!= 1,“args.length!= 1”);公共静态void断言(Bool条件,[CallerargumentExpression(“条件”)]字符串条件表达=默认值){if(!条件)抛出新的异常($“条件失败:{conditionExpression}”);}
这打开了起来图书馆和基础架构代码的绝佳性,包括戒掉毒品表达< Func < T > >
仅用于获取所传递表达式的名称和所涉及的反射开销。
我的个人最爱之一,从新属性中受益的是NotNull
方法,该方法断言不存在的对象空值
如下:
静态void m(人人){var地址= person.notnull()。地址;var亲属= person.lelives.notnull();静态void notnull(这个t obj,string message = null)
以前,您可以在不提供消息的情况下实现的最好的是包含typeof (T)。FullName
在异常消息中。现在可以添加另一个参数来捕获调用方法的表达式。有几个Roslyn可用性注释,可以按以下方法改进断言方法:
[return: NotNull] public static T NotNull([NotNull] this T?obj,字符串?message = default, [CallerArgumentExpression("obj")]字符串?T: class {return obj ??抛出新的ArgumentNullException(parameterName, message);}
用这种方法,你可以灵活的断言表达式对不空值
.你可以让CallerArgumentExpression
属性工作它的魔力,或者您可以通过自定义消息。对于后者,Resharper和Rider甚至将提供代码完成以使用指定的变量名称而不是调用的表达式:
当然,重新哈奶和骑手2021.3带有一组新检查,帮助您以正确的方式使用该属性。例如,在呼叫网站上,您将获得一个显式传递值时发出的警告,这最有可能意外:
在方法定义中,您将被防止意外地生成它自我指涉…
从提供不正确的参数名称…
,从与其他编译器服务属性冲突:
目前仍然存在的一个问题是,他们没有能力的引用参数nameof
操作符为了避免魔法弦。如果这个问题对你来说很重要,一定要给它投票!在那之前,ReSharper和Rider会为你提供保障有效参数名的代码补全但在重命名时,还更新参数引用:
我们很好奇,问人们他们使用调用者信息属性的目的。除了异常消息,验证和INotifyPropertyChanged
我们还发现了一些变化DebounceMonitoring作为一个非常有趣的项目:
根据他们的呼叫位置跟踪触控/点击脱扣倒计时https://t.co/l3W8wSPpdo
——瓦迪姆·塞多夫(@sidovsky_)2021年10月20日
下载重新抛弃2021.3 EAP.或者看看骑手2021.3 EAP以最好的方式开始利用C#10。我们很乐意听到你的想法!