C# 检查Null的更好方法

C# 检查Null的更好方法,c#,asp.net-web-api,design-patterns,dependency-injection,C#,Asp.net Web Api,Design Patterns,Dependency Injection,我有一个WEB ApicController,它通过依赖项注入注入了一些依赖项。现在我的问题是我是否必须检查这些依赖项是否为null。如果没有检查完成,那么静态代码分析工具会将其标记为问题。 我想知道处理这些情况的一般最佳做法是什么。在这种情况下,空对象模式有用吗 下面是示例代码 public ExGatewayController(ILogger logger, IUtilityHelper utilityHelper) { if (logger == null) {

我有一个WEB ApicController,它通过依赖项注入注入了一些依赖项。现在我的问题是我是否必须检查这些依赖项是否为null。如果没有检查完成,那么静态代码分析工具会将其标记为问题。 我想知道处理这些情况的一般最佳做法是什么。在这种情况下,空对象模式有用吗 下面是示例代码

public ExGatewayController(ILogger logger, IUtilityHelper utilityHelper)
{

    if (logger == null)
    {
        throw new ArgumentNullException(nameof(logger));
    }
    if (utilityHelper == null)
    {
        throw new ArgumentNullException(nameof(utilityHelper));
    }
    _utilityHelper = utilityHelper;
    _logger = logger;
}
我认为在C#8中可以使用不可为null的引用类型,类似这样的类型(不确定它是否有效,我希望它已经发布):

您可以使用库和写行

Guard.IsNotNull(logger, nameof(logger))
还有对表达式的支持,比如

Guard.IsNotNull(() => logger)

但我认为它的速度要慢一些(与第一个示例相比)

Im使用下一个变体:

public ExGatewayController(ILogger logger, IUtilityHelper utilityHelper)
{
    _utilityHelper = utilityHelper ?? throw new ArgumentNullException(nameof(utilityHelper));;
    _logger = logger ?? throw new ArgumentNullException(nameof(logger));
}

我会像你一样保留它

可以配置分析工具,并根据您所属团队的重要内容和已设置的规则来选择是否使用这些工具

检查空值将确保没有代码会运行,除非您传递了某些内容

这是我经常看到的。接受任何东西,即使是空值,然后经过许多层,最终某个东西尝试使用该东西,但失败了,出现了一个在调试时很难跟踪的异常。最好尽早停止,这将改进您的应用程序并减少以后的问题

是的,您可以像前面的一个答案所建议的那样使用语法糖,但这是在做同样的事情,因此除了减少代码行之外,它不会真正改变任何东西

总之,你所拥有的一切都很好。

在C#8中,语法是相反的。这意味着,如果启用编译器检查,则默认情况下所有内容都是非空的,并且当您使用
标记类型时,所有内容都将变为空,如
ILogger?
中所示。请注意,这只是设计时检查。如果传入
null
,则在运行时不会引发异常。C#9将(很可能)使用
获得很好的语法,但在这种情况下,
应该放在变量名上,如:
ILogger!,IUtilityHelper实用性助手
public ExGatewayController(ILogger logger, IUtilityHelper utilityHelper)
{
    _utilityHelper = utilityHelper ?? throw new ArgumentNullException(nameof(utilityHelper));;
    _logger = logger ?? throw new ArgumentNullException(nameof(logger));
}