使用[NotNull]作为方法的参数

Sir*_*ifi 28 c#

从ASP.NET MVC的源代码中考虑以下代码:

public static IApplicationBuilder UseMvc(
            [NotNull] this IApplicationBuilder app,
            [NotNull] Action<IRouteBuilder> configureRoutes) {...}
Run Code Online (Sandbox Code Playgroud)

根据这个答案,带注释的参数不能为空.那为什么我可以将null传递给方法呢?也就是说,在下面的情况下,为什么编译器没有给我任何错误?

app.UseMvc(null);
Run Code Online (Sandbox Code Playgroud)

Dmy*_*nko 34

可能导致编译器生成错误的唯一属性是ObsoleteAttribute.这是因为该属性的行为被硬编码到编译器中.

像属性这样的NotNull属性通常意味着工具(如ReSharper)在编写代码时生成警告或错误.请在此处阅读此特定属性.

您还可以使用PostSharp等工具发出额外的构建时错误.

  • 链接https://github.com/aspnet/Home/wiki/Engineering-guidelines#argument-null-checking没有谈到[NotNull] (8认同)

Chr*_*sic 13

如果您希望将Null检查移动到方面,而不需要手动完成.明确的解决方案是使用Fody开源构建编织器.具体来说,您想要利用NullGuard Fody

PM>安装包NullGuard.Fody

应该是设置为使用带有零防护的Fody所需的一切.文档显示了如果您愿意,您可以如何进行细粒度控制.

  • 为什么要消除所有空引用异常?您仍然需要检查任何公共或受保护的方法。调用者可能不使用 C# 或不使用 C# &gt;= 8.0、禁用可为 null 的引用类型或只是忽略编译器警告。 (2认同)