dot net core 如何处理 Arg.NotNull 和 Contract.Requires 资产

How does dot net core process Arg.NotNull and Contract.Requires assets

提问人:Stadub Dima 提问时间:2/18/2019 最后编辑:Stadub Dima 更新时间:2/19/2019 访问量:554

问:

aspnet-api-versioning中,我发现了一个代码块:

DefaultApiControllerFilter( IEnumerable<IApiControllerSpecification> pecifications )
        {
            Arg.NotNull( specifications, nameof( specifications ) );
            this.specifications = specifications.ToArray();
        }

感兴趣的块来自命名空间。Arg.NotNull( value, "text" );Microsoft

代码中有几个类似的断言。另一个例子是来自Contract.Requires()System.Diagnostics.Contracts

尝试搜索有关工作原则的 Microsoft 文档,但没有找到信息。

因此,也许可以帮助找出它是如何工作的:例如postsharp代码重写,提供运行时条件检查,或者只是抛出异常(但它没有在文档中提及)?Debug.Assert

c# asp.net-core .net-core 代码合约

评论


答:

1赞 Ananke 2/18/2019 #1

它们是代码协定(参见 https://learn.microsoft.com/en-us/dotnet/framework/debug-trace-profile/code-contractshttps://www.microsoft.com/en-us/research/project/code-contracts/?from=http%3A%2F%2Fresearch.microsoft.com%2Fen-us%2Fprojects%2Fcontracts%2Fuserdoc.pdf)

不幸的是,他们并没有真正起飞,这个项目有点被放弃了,这是一种耻辱,因为他们有潜力。

评论

0赞 Stadub Dima 2/18/2019
在源下载发现有 2 个不同的命名空间 - Microsoft 和 System.Diagnostics.Contracts - 因此更新了问题文本
0赞 Panagiotis Kanavos 2/18/2019
@DimaS关键词是 .即使编译了 .NET Core 的源代码,也没有工具可以验证协定abandoned
0赞 Stadub Dima 2/18/2019 #2

下载库源码后,编译并查看编译后的代码,发现只是一个带有方法的共享代码项目Microsoft::Arg

internal static void NotNull<T>(T value, string name) where T : class 
    {
      if ((object) value == null)    throw new ArgumentNullException(name);
    }

并且是一个代码协定断言代码生成扩展,它...不会生成任何缺少断言后生成事件的代码。stackowerflow 上的类似提示Contract.Requires(condition)

评论

1赞 Panagiotis Kanavos 2/18/2019
现在,由于 .NET Core 3.0 和 C# 8 添加了可为 null 的引用,这已经过时了。这个代码片段也不是代码协定的示例,它只是一个保护子句。可为 null 的引用或 Roslyn 分析器比这强大得多。