在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
的形式提供运行时条件检查,或者只是抛出异常(但在文档中未提及)?
答案 0 :(得分:1)
它们是代码合同(请参见https://docs.microsoft.com/en-us/dotnet/framework/debug-trace-profile/code-contracts和https://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。