点网核心如何处理Arg.NotNull和Contract.Requires资产

时间:2019-02-18 10:15:01

标签: c# .net asp.net-core .net-core code-contracts

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的形式提供运行时条件检查,或者只是抛出异常(但在文档中未提及)?

2 个答案:

答案 0 :(得分:1)

它们是代码合同(请参见https://docs.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

不幸的是,他们并没有真正起飞,并且该项目被放弃了,这很遗憾,因为他们有潜力。

答案 1 :(得分:0)

下载库源代码后,进行编译并查看经过编译的代码,发现Microsoft::Arg只是具有方法的shared code project

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

,而Contract.Requires(condition)Code Contract的断言代码生成扩展,由于不存在assert post build事件,因此它不会产生任何代码。 The similar sutuation on stackowerflow