C# NotNull属性

C# NotNull属性,c#,asp.net-core,C#,Asp.net Core,我正在查看asp.net vnext,并注意到他们建议使用NotNull属性,而不是显式检查输入参数是否为null并抛出ArgumentNullException。让我困惑的是,根据这条准则,声明这个属性就足够了,检查代码将在编译时生成到方法体中。我在测试项目中尝试过这样做,但是魔法没有发生,即它抛出了异常System.NullReferenceException,而不是System.ArgumentNullException。这是怎么回事?他们是否打算使用某个AOP库在编译时注入检查代码?No

我正在查看asp.net vnext,并注意到他们建议使用
NotNull
属性,而不是显式检查输入参数是否为null并抛出
ArgumentNullException
。让我困惑的是,根据这条准则,声明这个属性就足够了,检查代码将在编译时生成到方法体中。我在测试项目中尝试过这样做,但是魔法没有发生,即它抛出了异常
System.NullReferenceException
,而不是
System.ArgumentNullException
。这是怎么回事?他们是否打算使用某个AOP库在编译时注入检查代码?

NotNullAttribute已经消失。它是由ASP.NET团队开发的,随后由ASP.NET团队开发。截至2016年1月12日,没有将其恢复的计划。(当时,我在ASP.NET团队工作。)


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

但是,截至2015年6月17日,该功能尚未准备就绪。它将在以后的版本中出现。到目前为止,只是:


@usr在ASP.NET 5/DNX中,您可以添加修改代码的预编译步骤,讨论如何使用build weavers实现此目的任何注释,为什么删除?它非常有用,甚至存在于R#annotations库中。代码契约也基本上已经死了。目前,imo对不可为null的类型没有很好的支持。@VictorHurdugaci我发现在阅读github上ASP核心项目的工程指南时,它们仍然规定必须使用此属性,这让我感到困惑。因此,如果我们要尝试并遵循微软团队自己正在使用()的约定,使我们自己的项目尽可能地遵循框架约定,那么这肯定仍然存在???看看微软的EF Core 2.0,它正在源代码中使用(例如第53行)@MEMark这是他们自己的属性:
[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)]
internal sealed class NotNullAttribute : Attribute
{
}