net工具 bob2002网站

调用者参数表达式 - 查看C#10中的新语言功能

ReSharper和Rider支持c# 8

欢迎来到我们系列的第二部分,在这里我们将仔细看看新的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作为一个非常有趣的项目:

下载重新抛弃2021.3 EAP.或者看看骑手2021.3 EAP以最好的方式开始利用C#10。我们很乐意听到你的想法!

发现更多

Baidu