【问题标题】:A better way to check for Null [closed]检查 Null 的更好方法 [关闭]
【发布时间】:2020-01-17 08:33:38
【问题描述】:

我有一个 WEB API 控制器,它有一些通过依赖注入注入的依赖。现在我的问题是我是否必须为这些依赖项检查 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# asp.net-web-api design-patterns dependency-injection


    【解决方案1】:

    我会保持原样。

    可以配置分析工具,并根据对您所在团队的重要性以及已经制定的规则决定是否处理某些事情。

    检查空值将确保除非您通过某些东西,否则不会运行任何代码。

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

    是的,您可以像之前的答案之一所建议的那样使用语法糖,但这是在做同样的事情,所以除了更少的代码行之外,它并没有真正改变任何东西。

    归根结底,你所拥有的一切都很好。

    【讨论】:

      【解决方案2】:

      你可以使用Guards库并写一行

      Guard.IsNotNull(logger, nameof(logger))
      

      也支持表达式

      Guard.IsNotNull(() => logger)
      

      但我认为它更慢(与第一个样本相比)

      【讨论】:

        【解决方案3】:

        我认为在 C#8 中你可以使用不可为空的引用类型,像这样(不确定它是否有效,我希望它已经发布):

        public ExGatewayController(ILogger! logger, IUtilityHelper! utilityHelper)
        {
            _utilityHelper = utilityHelper;
            _logger = logger;
        }
        

        https://github.com/dotnet/roslyn/issues/227

        【讨论】:

        • 在 C# 8 中的语法是相反的。这意味着,如果启用编译器检查,默认情况下所有内容都是非空的,并且在使用 ? 标记类型时变为可空,如ILogger?。请注意,这只是设计时检查。如果您确实传入null,则不会在运行时引发异常。 C# 9 将(可能)使用! 获得很好的语法,但在这种情况下,! 应该放在变量名上,如:ILogger logger!, IUtilityHelper utilityHelper!
        【解决方案4】:

        我正在使用下一个变体:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-31
          • 1970-01-01
          • 2016-09-23
          • 2013-05-24
          • 2017-05-29
          • 1970-01-01
          相关资源
          最近更新 更多