NotNull属性

Ale*_*ich 49 c# asp.net-core

我正在看asp.net vnext 工程指南,并注意到他们建议使用NotNull属性而不是显式检查null和throw 的输入参数ArgumentNullException.让我感到困惑的是,根据这个指南,它足以声明这个属性,并且检查代码将在编译时生成到方法体中.我试图在我的测试项目中做到这一点,但魔术没有发生,即它抛出异常System.NullReferenceException而不是System.ArgumentNullException.这应该如何工作?他们是否会在编译时使用一些AOP库来注入检查代码?

Vic*_*aci 54

NotNullAttribute走了.它被有条件的抛出ArgumentNullException取代,随后由ASP.NET团队删除.截至2016年1月12日,没有计划将其恢复.(那时,我正在研究ASP.NET团队.)


该属性将通过预编译步骤替换,使用Roslyn,通过执行实际检查的代码.

但是,截至2015年6月17日,该功能尚未准备就绪.它将在更高版本中发布.到目前为止,它只是一个空的内部属性,应该再次在每个项目中实现:

[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)]
internal sealed class NotNullAttribute : Attribute
{
}
Run Code Online (Sandbox Code Playgroud)

  • 任何评论,为什么删除?它非常有用,它甚至存在于R#注释库中. (57认同)
  • 代码合同也基本上已经死了.目前对非可空类型imo没有很好的支持. (6认同)
  • @VictorHurdugaci我觉得很困惑的是,在github上阅读ASP核心项目的工程指南时,他们仍然规定你必须使用这个属性.因此,如果我们要尝试遵循Microsoft团队自己使用的约定(https://github.com/aspnet/Home/wiki/Engineering-guidelines)来尝试使我们自己的项目尽可能地遵循框架约定,那肯定这仍然存在于某个地方??? (5认同)
  • @MEMark这是他们自己的属性:https://github.com/aspnet/EntityFrameworkCore/blob/a3f0a78c41fe209924f8fb39fc77c421236f1bbe/src/Shared/CodeAnnotations.cs#L8 (4认同)
  • 查看Microsoft的EF Core 2.0,它已在源代码中使用(例如,第53行)https://github.com/aspnet/EntityFrameworkCore/blob/release/2.0/src/EFCore/EntityFrameworkQueryableExtensions.cs (3认同)
  • 这存在于 .NET Core 3.1 中。 (3认同)